標準愚痴出力

個人的なIT作業ログです。もしかしたら一般的に参考になることが書いているかもしれません(弱気

SQL-Bless とgo-sql-driver/mysql と日時データ型とタイムゾーン

後者についてはこれらがずれてしまっていると、例えばTIMESTAMP型に内部的に保存されている値は通常UTCで解釈すべき値ですが、JSTとして解釈しないといけない値が入ってしまっているといった事態が発生します

マジだったわー

SQL> desc testtbl;

ID NAME TYPE NULL?
1 TESTNO decimal NOT NULL
2 DTTM timestamp(3) NULL
3 DT date NULL
4 TM time(3) NULL

SQL> select * from testtbl;

TESTNO DTTM DT TM
10 2024-05-25 13:45:33.3 +00:00 2024-05-26 00:00:00 +00:00 14:53:26.600

timestamp型のカラムのタイムゾーン情報が +00:00 になってしまっている。この結果をもとに SQL を実行してもマッチしない

UPDATE  testtbl
   SET  DTTM = TIMESTAMP '2024-05-25 13:45:34.4+00:00'
 WHERE  TESTNO = 10
   AND  DTTM = TIMESTAMP '2024-05-25 13:45:33.3+00:00'
   AND  DT = DATE '2024-05-26'
   AND  TM = TIME '14:53:26.6'
Execute? [y/n] y
Starts a transaction
0 record(s) updated.
SQL>

接続文字列に ?parseTime=true&loc=Asia%2FTokyo みたいに指定するようにしたら、TIMESTAMP の比較も更新用SQLも期待どおり動くようになった。

SQL> select * from testtbl;

TESTNO DTTM DT TM
10 2024-05-25 13:45:33.3 +09:00 2024-05-26 00:00:00 +09:00 14:53:26.600
SQL> UPDATE  testtbl
  2>    SET  DTTM = TIMESTAMP '2024-05-25 13:45:34.4+00:00'
  3>  WHERE  TESTNO = 10
  4>    AND  DTTM = TIMESTAMP '2024-05-25 13:45:33.3+09:00'
  5>    AND  DT = DATE '2024-05-26'
  6>    AND  TM = TIME '14:53:26.6'
1 record(s) updated.
SQL>

parseTime=true くらいはデフォルトにして、loc も OS の設定を拾ってくれたらいいのになぁ ( OS ごとに違うからしんどいか )