|
7 | 7 | *
|
8 | 8 | *
|
9 | 9 | * IDENTIFICATION
|
10 |
| - * $Header: /cvsroot/pgsql/src/backend/utils/adt/Attic/dt.c,v 1.44 1997/11/17 16:23:33 thomas Exp $ |
| 10 | + * $Header: /cvsroot/pgsql/src/backend/utils/adt/Attic/dt.c,v 1.45 1997/12/0423:30:52 thomas Exp $ |
11 | 11 | *
|
12 | 12 | *-------------------------------------------------------------------------
|
13 | 13 | */
|
@@ -4099,103 +4099,54 @@ EncodeSpecialDateTime(DateTime dt, char *str)
|
4099 | 4099 | int
|
4100 | 4100 | EncodeDateOnly(structtm*tm,intstyle,char*str)
|
4101 | 4101 | {
|
4102 |
| -#ifFALSE |
4103 |
| -intday; |
4104 |
| - |
4105 |
| -#endif |
4106 |
| - |
4107 | 4102 | if ((tm->tm_mon<1)|| (tm->tm_mon>12))
|
4108 | 4103 | return-1;
|
4109 | 4104 |
|
4110 |
| -/* compatible with ISO date formats */ |
4111 |
| -if (style==USE_ISO_DATES) |
| 4105 | +switch (style) |
4112 | 4106 | {
|
4113 |
| -if (tm->tm_year>0) |
4114 |
| -{ |
4115 |
| -sprintf(str,"%04d-%02d-%02d", |
| 4107 | +/* compatible with ISO date formats */ |
| 4108 | +caseUSE_ISO_DATES: |
| 4109 | +if (tm->tm_year>0) |
| 4110 | +sprintf(str,"%04d-%02d-%02d", |
4116 | 4111 | tm->tm_year,tm->tm_mon,tm->tm_mday);
|
4117 |
| - |
4118 |
| -} |
4119 |
| -else |
4120 |
| -{ |
4121 |
| -sprintf(str,"%04d-%02d-%02d %s", |
| 4112 | +else |
| 4113 | +sprintf(str,"%04d-%02d-%02d %s", |
4122 | 4114 | -(tm->tm_year-1),tm->tm_mon,tm->tm_mday,"BC");
|
4123 |
| -} |
| 4115 | +break; |
4124 | 4116 |
|
4125 | 4117 | /* compatible with Oracle/Ingres date formats */
|
4126 |
| -} |
4127 |
| -elseif (style==USE_SQL_DATES) |
4128 |
| -{ |
4129 |
| -if (EuroDates) |
4130 |
| -{ |
4131 |
| -sprintf(str,"%02d/%02d",tm->tm_mday,tm->tm_mon); |
4132 |
| -} |
4133 |
| -else |
4134 |
| -{ |
4135 |
| -sprintf(str,"%02d/%02d",tm->tm_mon,tm->tm_mday); |
4136 |
| -} |
4137 |
| -if (tm->tm_year>0) |
4138 |
| -{ |
4139 |
| -sprintf((str+5),"/%04d",tm->tm_year); |
4140 |
| - |
4141 |
| -} |
4142 |
| -else |
4143 |
| -{ |
4144 |
| -sprintf((str+5),"/%04d %s",-(tm->tm_year-1),"BC"); |
4145 |
| -} |
4146 |
| - |
4147 |
| -/* backward-compatible with traditional Postgres abstime dates */ |
4148 |
| -} |
4149 |
| -else |
4150 |
| -{/* if (style == USE_POSTGRES_DATES) */ |
4151 |
| - |
4152 |
| -#ifFALSE |
4153 |
| -day=date2j(tm->tm_year,tm->tm_mon,tm->tm_mday); |
4154 |
| -#ifdefDATEDEBUG |
4155 |
| -printf("EncodeDateOnly- day is %d\n",day); |
4156 |
| -#endif |
4157 |
| -tm->tm_wday=j2day(day); |
4158 |
| - |
4159 |
| -strncpy(str,days[tm->tm_wday],3); |
4160 |
| -strcpy((str+3)," "); |
4161 |
| - |
4162 |
| -if (EuroDates) |
4163 |
| -{ |
4164 |
| -sprintf((str+4),"%02d %3s",tm->tm_mday,months[tm->tm_mon-1]); |
4165 |
| -} |
4166 |
| -else |
4167 |
| -{ |
4168 |
| -sprintf((str+4),"%3s %02d",months[tm->tm_mon-1],tm->tm_mday); |
4169 |
| -} |
4170 |
| -if (tm->tm_year>0) |
4171 |
| -{ |
4172 |
| -sprintf((str+10)," %04d",tm->tm_year); |
| 4118 | +caseUSE_SQL_DATES: |
| 4119 | +if (EuroDates) |
| 4120 | +sprintf(str,"%02d/%02d",tm->tm_mday,tm->tm_mon); |
| 4121 | +else |
| 4122 | +sprintf(str,"%02d/%02d",tm->tm_mon,tm->tm_mday); |
| 4123 | +if (tm->tm_year>0) |
| 4124 | +sprintf((str+5),"/%04d",tm->tm_year); |
| 4125 | +else |
| 4126 | +sprintf((str+5),"/%04d %s",-(tm->tm_year-1),"BC"); |
| 4127 | +break; |
4173 | 4128 |
|
4174 |
| -} |
4175 |
| -else |
4176 |
| -{ |
4177 |
| -sprintf((str+10)," %04d %s",-(tm->tm_year-1),"BC"); |
4178 |
| -} |
4179 |
| -#endif |
| 4129 | +/* German-style date format */ |
| 4130 | +caseUSE_GERMAN_DATES: |
| 4131 | +sprintf(str,"%02d.%02d",tm->tm_mday,tm->tm_mon); |
| 4132 | +if (tm->tm_year>0) |
| 4133 | +sprintf((str+5),"/%04d",tm->tm_year); |
| 4134 | +else |
| 4135 | +sprintf((str+5),"/%04d %s",-(tm->tm_year-1),"BC"); |
| 4136 | +break; |
4180 | 4137 |
|
4181 | 4138 | /* traditional date-only style for Postgres */
|
4182 |
| -if (EuroDates) |
4183 |
| -{ |
4184 |
| -sprintf(str,"%02d-%02d",tm->tm_mday,tm->tm_mon); |
4185 |
| -} |
4186 |
| -else |
4187 |
| -{ |
4188 |
| -sprintf(str,"%02d-%02d",tm->tm_mon,tm->tm_mday); |
4189 |
| -} |
4190 |
| -if (tm->tm_year>0) |
4191 |
| -{ |
4192 |
| -sprintf((str+5),"-%04d",tm->tm_year); |
4193 |
| - |
4194 |
| -} |
4195 |
| -else |
4196 |
| -{ |
4197 |
| -sprintf((str+5),"-%04d %s",-(tm->tm_year-1),"BC"); |
4198 |
| -} |
| 4139 | +caseUSE_POSTGRES_DATES: |
| 4140 | +default: |
| 4141 | +if (EuroDates) |
| 4142 | +sprintf(str,"%02d-%02d",tm->tm_mday,tm->tm_mon); |
| 4143 | +else |
| 4144 | +sprintf(str,"%02d-%02d",tm->tm_mon,tm->tm_mday); |
| 4145 | +if (tm->tm_year>0) |
| 4146 | +sprintf((str+5),"-%04d",tm->tm_year); |
| 4147 | +else |
| 4148 | +sprintf((str+5),"-%04d %s",-(tm->tm_year-1),"BC"); |
| 4149 | +break; |
4199 | 4150 | }
|
4200 | 4151 |
|
4201 | 4152 | #ifdefDATEDEBUG
|
@@ -4232,6 +4183,14 @@ EncodeTimeOnly(struct tm * tm, double fsec, int style, char *str)
|
4232 | 4183 |
|
4233 | 4184 | /* EncodeDateTime()
|
4234 | 4185 | * Encode date and time interpreted as local time.
|
| 4186 | + * Support several date styles: |
| 4187 | + * Postgres - day mon hh:mm:ss yyyy tz |
| 4188 | + * SQL - mm/dd/yyyy hh:mm:ss.ss tz |
| 4189 | + * ISO - yyyy-mm-dd hh:mm:ss+/-tz |
| 4190 | + * German - dd.mm/yyyy hh:mm:ss tz |
| 4191 | + * Variants (affects order of month and day for Postgres and SQL styles): |
| 4192 | + * US - mm/dd/yyyy |
| 4193 | + * European - dd/mm/yyyy |
4235 | 4194 | */
|
4236 | 4195 | int
|
4237 | 4196 | EncodeDateTime(structtm*tm,doublefsec,int*tzp,char**tzn,intstyle,char*str)
|
@@ -4261,124 +4220,134 @@ EncodeDateTime(struct tm * tm, double fsec, int *tzp, char **tzn, int style, cha
|
4261 | 4220 | #endif
|
4262 | 4221 | #endif
|
4263 | 4222 |
|
4264 |
| -/* compatible with ISO date formats */ |
4265 |
| -if (style==USE_ISO_DATES) |
| 4223 | +switch (style) |
4266 | 4224 | {
|
4267 |
| -if (tm->tm_year>0) |
4268 |
| -{ |
4269 |
| -sprintf(str,"%04d-%02d-%02d %02d:%02d:", |
4270 |
| -tm->tm_year,tm->tm_mon,tm->tm_mday,tm->tm_hour,tm->tm_min); |
4271 |
| -sprintf((str+17), ((fsec!=0) ?"%05.2f" :"%02.0f"),sec); |
| 4225 | +/* compatible with ISO date formats */ |
4272 | 4226 |
|
4273 |
| -if ((*tzn!=NULL)&& (tm->tm_isdst >=0)) |
| 4227 | +caseUSE_ISO_DATES: |
| 4228 | +if (tm->tm_year>0) |
4274 | 4229 | {
|
4275 |
| -if (tzp!=NULL) |
4276 |
| -{ |
4277 |
| -hour=-(*tzp /3600); |
4278 |
| -min= ((abs(*tzp) /60) %60); |
4279 |
| -} |
4280 |
| -else |
| 4230 | +sprintf(str,"%04d-%02d-%02d %02d:%02d:", |
| 4231 | +tm->tm_year,tm->tm_mon,tm->tm_mday,tm->tm_hour,tm->tm_min); |
| 4232 | +sprintf((str+17), ((fsec!=0) ?"%05.2f" :"%02.0f"),sec); |
| 4233 | + |
| 4234 | +if ((*tzn!=NULL)&& (tm->tm_isdst >=0)) |
4281 | 4235 | {
|
4282 |
| -hour=0; |
4283 |
| -min=0; |
| 4236 | +if (tzp!=NULL) |
| 4237 | +{ |
| 4238 | +hour=-(*tzp /3600); |
| 4239 | +min= ((abs(*tzp) /60) %60); |
| 4240 | +} |
| 4241 | +else |
| 4242 | +{ |
| 4243 | +hour=0; |
| 4244 | +min=0; |
| 4245 | +} |
| 4246 | +sprintf((str+strlen(str)), ((min!=0) ?"%+03d:%02d" :"%+03d"),hour,min); |
4284 | 4247 | }
|
4285 |
| -sprintf((str+strlen(str)), ((min!=0) ?"%+03d:%02d" :"%+03d"),hour,min); |
4286 |
| -} |
4287 | 4248 |
|
4288 |
| -} |
4289 |
| -else |
4290 |
| -{ |
4291 |
| -if (tm->tm_hour||tm->tm_min) |
4292 |
| -{ |
4293 |
| -sprintf(str,"%04d-%02d-%02d %02d:%02d %s", |
4294 |
| --(tm->tm_year-1),tm->tm_mon,tm->tm_mday,tm->tm_hour,tm->tm_min,"BC"); |
4295 | 4249 | }
|
4296 | 4250 | else
|
4297 | 4251 | {
|
4298 |
| -sprintf(str,"%04d-%02d-%02d %s", |
4299 |
| --(tm->tm_year-1),tm->tm_mon,tm->tm_mday,"BC"); |
| 4252 | +if (tm->tm_hour||tm->tm_min) |
| 4253 | +sprintf(str,"%04d-%02d-%02d %02d:%02d %s", |
| 4254 | +-(tm->tm_year-1),tm->tm_mon,tm->tm_mday,tm->tm_hour,tm->tm_min,"BC"); |
| 4255 | +else |
| 4256 | +sprintf(str,"%04d-%02d-%02d %s", |
| 4257 | +-(tm->tm_year-1),tm->tm_mon,tm->tm_mday,"BC"); |
4300 | 4258 | }
|
4301 |
| -} |
| 4259 | +break; |
4302 | 4260 |
|
4303 | 4261 | /* compatible with Oracle/Ingres date formats */
|
4304 |
| -} |
4305 |
| -elseif (style==USE_SQL_DATES) |
4306 |
| -{ |
4307 |
| -if (EuroDates) |
4308 |
| -{ |
4309 |
| -sprintf(str,"%02d/%02d",tm->tm_mday,tm->tm_mon); |
4310 |
| -} |
4311 |
| -else |
4312 |
| -{ |
4313 |
| -sprintf(str,"%02d/%02d",tm->tm_mon,tm->tm_mday); |
4314 |
| -} |
4315 |
| -if (tm->tm_year>0) |
4316 |
| -{ |
4317 |
| -sprintf((str+5),"/%04d %02d:%02d:%05.2f", |
4318 |
| -tm->tm_year,tm->tm_hour,tm->tm_min,sec); |
| 4262 | +caseUSE_SQL_DATES: |
| 4263 | +if (EuroDates) |
| 4264 | +sprintf(str,"%02d/%02d",tm->tm_mday,tm->tm_mon); |
| 4265 | +else |
| 4266 | +sprintf(str,"%02d/%02d",tm->tm_mon,tm->tm_mday); |
4319 | 4267 |
|
4320 |
| -if ((*tzn!=NULL)&& (tm->tm_isdst >=0)) |
| 4268 | +if (tm->tm_year>0) |
4321 | 4269 | {
|
4322 |
| -strcpy((str+22)," "); |
4323 |
| -strcpy((str+23),*tzn); |
| 4270 | +sprintf((str+5),"/%04d %02d:%02d:%05.2f", |
| 4271 | +tm->tm_year,tm->tm_hour,tm->tm_min,sec); |
| 4272 | + |
| 4273 | +if ((*tzn!=NULL)&& (tm->tm_isdst >=0)) |
| 4274 | +{ |
| 4275 | +strcpy((str+22)," "); |
| 4276 | +strcpy((str+23),*tzn); |
| 4277 | +} |
| 4278 | + |
4324 | 4279 | }
|
| 4280 | +else |
| 4281 | +sprintf((str+5),"/%04d %02d:%02d %s", |
| 4282 | +-(tm->tm_year-1),tm->tm_hour,tm->tm_min,"BC"); |
| 4283 | +break; |
4325 | 4284 |
|
4326 |
| -} |
4327 |
| -else |
4328 |
| -{ |
| 4285 | +/* German variant on European style; note mixed delimiters dd.mm/yyyy */ |
| 4286 | +caseUSE_GERMAN_DATES: |
| 4287 | +sprintf(str,"%02d.%02d",tm->tm_mday,tm->tm_mon); |
| 4288 | +if (tm->tm_year>0) |
| 4289 | +{ |
| 4290 | +sprintf((str+5),"/%04d %02d:%02d:%05.2f", |
| 4291 | +tm->tm_year,tm->tm_hour,tm->tm_min,sec); |
| 4292 | + |
| 4293 | +if ((*tzn!=NULL)&& (tm->tm_isdst >=0)) |
| 4294 | +{ |
| 4295 | +strcpy((str+22)," "); |
| 4296 | +strcpy((str+23),*tzn); |
| 4297 | +} |
| 4298 | + |
| 4299 | +} |
| 4300 | +else |
4329 | 4301 | sprintf((str+5),"/%04d %02d:%02d %s",
|
4330 | 4302 | -(tm->tm_year-1),tm->tm_hour,tm->tm_min,"BC");
|
4331 |
| -} |
| 4303 | +break; |
4332 | 4304 |
|
4333 | 4305 | /* backward-compatible with traditional Postgres abstime dates */
|
4334 |
| -} |
4335 |
| -else |
4336 |
| -{/* if (style == USE_POSTGRES_DATES) */ |
4337 |
| -day=date2j(tm->tm_year,tm->tm_mon,tm->tm_mday); |
| 4306 | +caseUSE_POSTGRES_DATES: |
| 4307 | +default: |
| 4308 | +day=date2j(tm->tm_year,tm->tm_mon,tm->tm_mday); |
4338 | 4309 | #ifdefDATEDEBUG
|
4339 |
| -printf("EncodeDateTime- day is %d\n",day); |
| 4310 | +printf("EncodeDateTime- day is %d\n",day); |
4340 | 4311 | #endif
|
4341 |
| -tm->tm_wday=j2day(day); |
| 4312 | +tm->tm_wday=j2day(day); |
4342 | 4313 |
|
4343 |
| -strncpy(str,days[tm->tm_wday],3); |
4344 |
| -strcpy((str+3)," "); |
| 4314 | +strncpy(str,days[tm->tm_wday],3); |
| 4315 | +strcpy((str+3)," "); |
4345 | 4316 |
|
4346 |
| -if (EuroDates) |
4347 |
| -{ |
4348 |
| -sprintf((str+4),"%02d %3s",tm->tm_mday,months[tm->tm_mon-1]); |
4349 |
| -} |
4350 |
| -else |
4351 |
| -{ |
4352 |
| -sprintf((str+4),"%3s %02d",months[tm->tm_mon-1],tm->tm_mday); |
4353 |
| -} |
4354 |
| -if (tm->tm_year>0) |
4355 |
| -{ |
4356 |
| -sprintf((str+10)," %02d:%02d",tm->tm_hour,tm->tm_min); |
4357 |
| -if (fsec!=0) |
| 4317 | +if (EuroDates) |
| 4318 | +sprintf((str+4),"%02d %3s",tm->tm_mday,months[tm->tm_mon-1]); |
| 4319 | +else |
| 4320 | +sprintf((str+4),"%3s %02d",months[tm->tm_mon-1],tm->tm_mday); |
| 4321 | + |
| 4322 | +if (tm->tm_year>0) |
4358 | 4323 | {
|
4359 |
| -sprintf((str+16),":%05.2f %04d",sec,tm->tm_year); |
4360 |
| -if ((*tzn!=NULL)&& (tm->tm_isdst >=0)) |
| 4324 | +sprintf((str+10)," %02d:%02d",tm->tm_hour,tm->tm_min); |
| 4325 | +if (fsec!=0) |
4361 | 4326 | {
|
4362 |
| -strcpy((str+27)," "); |
4363 |
| -strcpy((str+28),*tzn); |
| 4327 | +sprintf((str+16),":%05.2f %04d",sec,tm->tm_year); |
| 4328 | +if ((*tzn!=NULL)&& (tm->tm_isdst >=0)) |
| 4329 | +{ |
| 4330 | +strcpy((str+27)," "); |
| 4331 | +strcpy((str+28),*tzn); |
| 4332 | +} |
4364 | 4333 | }
|
4365 |
| -} |
4366 |
| -else |
4367 |
| -{ |
4368 |
| -sprintf((str+16),":%02.0f %04d",sec,tm->tm_year); |
4369 |
| -if ((*tzn!=NULL)&& (tm->tm_isdst >=0)) |
| 4334 | +else |
4370 | 4335 | {
|
4371 |
| -strcpy((str+24)," "); |
4372 |
| -strcpy((str+25),*tzn); |
| 4336 | +sprintf((str+16),":%02.0f %04d",sec,tm->tm_year); |
| 4337 | +if ((*tzn!=NULL)&& (tm->tm_isdst >=0)) |
| 4338 | +{ |
| 4339 | +strcpy((str+24)," "); |
| 4340 | +strcpy((str+25),*tzn); |
| 4341 | +} |
4373 | 4342 | }
|
4374 |
| -} |
4375 | 4343 |
|
4376 |
| -} |
4377 |
| -else |
4378 |
| -{ |
4379 |
| -sprintf((str+10)," %02d:%02d %04d %s", |
| 4344 | +} |
| 4345 | +else |
| 4346 | +{ |
| 4347 | +sprintf((str+10)," %02d:%02d %04d %s", |
4380 | 4348 | tm->tm_hour,tm->tm_min,-(tm->tm_year-1),"BC");
|
4381 |
| -} |
| 4349 | +} |
| 4350 | +break; |
4382 | 4351 | }
|
4383 | 4352 |
|
4384 | 4353 | #ifdefDATEDEBUG
|
|