QUESTION(SQ01060015)
西暦2001年9日9日以降、プログラムが正しく動作しなくなる問題についての対応
ANSWER
この問題はUnix,Windows系プラットフォーム共通の特異日に関する問題であり、Y2Kと同様、同時多発する可能性のある日付問題です。
「西暦2001年9月9日以降に発生する問題」の内容
Unix,WindowsのTIME関数で求める通算秒は、GMT/UTC 1970年1月1日午前0時00分00秒を起点としている(1秒毎に1を加算)。この値がGMT/UTC 2001年9月9日午前1時46分40秒(日本時間同日 10時46分40分)に10進数の文字列表示で9桁から10桁になる。この桁あふれを考慮していない場合、問題が発生する。
1973.03.03 09:46:40(GMT) → 100000000秒
2001.09.09 01:46:39(GMT) → 999999999秒
2001.09.09 01:46:40(GMT)
→ 1000000000秒
不具合内容
(1)領域を9バイトしか確保していないため、桁あふれが発生した 場合に領域破壊をおこす。
(2)通算秒を文字列比較していたため、大小(時刻)比較が 逆転する(先頭の’1’と’9’の比較から1000000000以上の方が過去と判断される)。
しかし、もともとSQL Anywhereでは、日時を格納するエリアとして、8バイトのエリアを使用しております。この上位4バイトには日、時、分を格納し、下位4バイトには秒/ミリ秒を格納しています。
このことから、SQL Anywhereでは、1600-02-28
23:59:59 to 7911-01-01
00:00:00.の日付範囲についてサポートしておりますので上記のような問題は起こりません。
|