タイムスタンプが特定の日数の範囲にあるかどうかを確認するSQLクエリを書いています。
私はそれをPostgreSQLで記述しましたが、OracleとSQL Serverでは機能しません。
AND creation_date < (CURRENT_TIMESTAMP - interval '5 days')
AND creation_date >= (CURRENT_TIMESTAMP - interval '15 days')
異なるデータベース間でタイムスタンプを比較する一般的な方法はありますか?
私はSQL Serverの専門家ではありませんが、これがOracleとPostgresで動作することは知っています。MSSQLで動作する可能性はあると思いますが、ATMをテストする方法はありません。
AND creation_date < (CURRENT_TIMESTAMP - interval '5' day)
AND creation_date >= (CURRENT_TIMESTAMP - interval '15' day)
または、タイムスタンプの代わりに日付タイプを使用している場合、これを行うことができますが、MSSQLでは機能しないと確信しています。また、DATE型はOracleとPgでかなり異なります。
AND creation_date < CURRENT_DATE - 5
AND creation_date >= CURRENT_DATE - 15
OMGポニーのコメントで述べたように、タイムスタンプではなく日付型にのみ整数を追加できます。 (Oracleはサイレントにタイムスタンプを日付にキャストします)
select to_timestamp('2010-01-01 10:10:85.123', 'YYYY-MM-dd HH:MI:SS.MS') <
to_timestamp('2012-01-01 10:10:85.123', 'YYYY-MM-dd HH:MI:SS.MS');
2012
が2010
の後にあるため、trueを返します
すべてのデータベースエンジンで機能する共通の構文があるとは思いません。 SQL Serverでは、次のようにします。
AND creation_date BETWEEN DateAdd(dd, -5, GetUtcDate()) AND DateAdd(dd, -15, GetUtcDate())
Oracleについてはよくわかりません...
Oracle(これらのソリューションの両方をテストしました):
AND (creation_date BETWEEN sysdate-15 AND sysdate-6)
この構文も有効です。
AND (creation_date BETWEEN current_timestamp - INTERVAL '15' DAY
AND current_timestamp - INTERVAL '6' DAY)
SYSDATEとCURRENT_TIMESTAMPは同義です(一種の-コメントを参照)。
BETWEENは境界の値包括的を返すことに注意してください。 >=
date-15であるが<
date-5である値を探しているため、次の場合は-15から-6を指定する必要があります。 BETWEENを使用します。 BETWEEN式で上限-5を使用した回答は間違っています。
select * from timing where (db_time < CURRENT_DATE) AND (db_time > (CURRENT_DATE - INTERVAL '1' DAY)) ;
繰り返しますが、これはOracleに固有であり、intimeがTIMESTAMP(3)データ型であると想定すると、これを行うことができます
select * from MYTABLE where intime >= to_timestamp('2014-10-01 7:00:56', 'YYYY-MM-dd HH24:MI:SS')