[pgsql-jp: 27752] Re: Timestamp型で60 秒?
sugita @ sra.co.jp
sugita @ sra.co.jp
2002年 10月 25日 (金) 23:51:41 JST
杉田です。
From: "Takashi Ishii" <t-ishii97 @ hitachi-kenki.co.jp>
Subject: [pgsql-jp: 27745] Timestamp型で60 秒?
Date: Fri, 25 Oct 2002 19:10:15 +0900
;;; RedHatLinux6.2J+PostgreSQL7.1.3
;;; でTimestamp型のところに
;;; '2002-10-28 18:00:59.997'を挿入して検索すると
;;; '2002-10-28 18:00:60'になってしまいます。
;;; data_part関数でミリ秒を検索すると’997’ときちんと表示
;;; されるのになぜでしょうか?
;;;
;;; 59秒997近辺はこの現象が出ます。
;;;
;;; この状態でpg_dumpコマンドでバックアップをして
;;; リストアしようとしても出来なくなってしまいます。
関連するところを全部見ていませんので、大まかにですが、7.2 以降を真似て、以下
のような修正が必要ですね。
==== src/backend/utils/adt/datetime.c
int
EncodeDateTime(struct tm * tm, double fsec, int *tzp, char **tzn, int style, char *str)
{
int day,
hour,
min;
double sec;
fprintf(stderr, "DEBUG: EncodeDateTime: Entering\n");
if ((tm->tm_mon < 1) || (tm->tm_mon > 12))
return -1;
sec = (tm->tm_sec + fsec);
switch (style)
{
/* compatible with ISO date formats */
case USE_ISO_DATES:
if (tm->tm_year > 0)
{
sprintf(str, "%04d-%02d-%02d %02d:%02d:",
tm->tm_year, tm->tm_mon, tm->tm_mday, tm->tm_hour, tm->tm_min);
#if 1
sprintf((str + 17), ((fsec != 0) ? "%013.10f" : "%02.0f"), sec);
/* ここで、7.2 の TrimTrailingZeros と同じことをする */
#else
sprintf((str + 17), ((fsec != 0) ? "%05.2f" : "%02.0f"), sec);
#endif
とすると、+09 となるのが、7.2 以降と違うのを別として、
=# select version();
version
---------------------------------------------------------------------
PostgreSQL 7.1.3 on i686-pc-linux-gnu, compiled by GCC egcs-2.91.66
(1 row)
sugita=# select t::timestamp from class1 ;
?column?
----------------------------
2002-10-28 18:00:59.997+09
(1 row)
sugita=#
Kenji Sugita
pgsql-jp メーリングリストの案内