同様の質問を1つだけ見つけましたが、MySQLに関するものです。
私はWebサービスに取り組んでいて、データベース(MS SQLサーバー)にクエリを実行する必要がありました。正しい結果が得られなかったため、SQLクライアントを介してクエリをテストすることにしました。WebサービスはHibernateを使用してDBにアクセスし、すべての時間値は常にlong値(unixエポック時間)として表されます。それをテストするために、UNIXタイムスタンプをTSQLタイムスタンプに変換する必要がありました。これは私が思いついたものです:
select dateadd(ms,123,'1970-01-01 00:00:00.0');
出力:
1970-01-01 00:00:00.123
しかし、私の実際のデータは少し大きかった
select dateadd(ms,1359016610667 ,'1970-01-01 00:00:00.0');
出力:
Error code 0, SQL state 22001: Data truncation
Error code 8115, SQL state 22003: Arithmetic overflow error converting expression to data type int.
だから、私は試しました:
select dateadd(ms,CAST (1359016610667 AS BIGINT) ,'1970-01-01 00:00:00.0');
まったく同じエラーを出力します。安全のために私は試しました:
select CAST (1359016610667 AS BIGINT)
出力:
1359016610667
javalongがTSQLbigintと同等であることを確認しました。どちらも長いです。dateadd ()のドキュメントを読み直すと、次のことがわかりました。8 B
DATEADD(datepart、number、date)
....
number日付のdatepartに追加されるintに解決
できる式です。ユーザー定義変数は有効です。
私がこれを正しく理解している場合、これは、UNIXタイムスタンプをTSQLタイムスタンプに変換するためにこのアプローチを使用できないことを意味します。これは、私の言語を許しますが、単なる愚かです。
私の質問は次のとおりです。
- この状況の私の解釈は正しいですか?
- TSQLでこの変換を行うための他のワンライナーはありますか?
日付引数()を変更するPS'1970-01-01 00:00:00.0'
は、解決策として受け入れられません。私はデバッグ中ですが、ミリ秒を再計算したくありません:)