|
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/04 23: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(struct tm * tm, int style, char *str)
|
4101 | 4101 | {
|
4102 |
| -#if FALSE |
4103 |
| - int day; |
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 | + case USE_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 |
| - else if (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 |
| -#if FALSE |
4153 |
| - day = date2j(tm->tm_year, tm->tm_mon, tm->tm_mday); |
4154 |
| -#ifdef DATEDEBUG |
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 | + case USE_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 | + case USE_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 | + case USE_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 | #ifdef DATEDEBUG
|
@@ -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(struct tm * tm, double fsec, int *tzp, char **tzn, int style, 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 | + case USE_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 |
| - else if (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 | + case USE_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 | + case USE_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 | + case USE_POSTGRES_DATES: |
| 4307 | + default: |
| 4308 | + day = date2j(tm->tm_year, tm->tm_mon, tm->tm_mday); |
4338 | 4309 | #ifdef DATEDEBUG
|
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 | #ifdef DATEDEBUG
|
|
0 commit comments