[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 メーリングリストの案内