web-dev-qa-db-ja.com

Oracle、PostgreSQL、SQL Serverでタイムスタンプを比較する一般的な方法

タイムスタンプが特定の日数の範囲にあるかどうかを確認するSQLクエリを書いています。

私はそれをPostgreSQLで記述しましたが、OracleとSQL Serverでは機能しません。

AND creation_date < (CURRENT_TIMESTAMP - interval '5 days')
AND creation_date >= (CURRENT_TIMESTAMP - interval '15 days')

異なるデータベース間でタイムスタンプを比較する一般的な方法はありますか?

19
Pratik Garg

私は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はサイレントにタイムスタンプを日付にキャストします)

17
Scott Bailey

Postgresqlで2つのタイムスタンプを比較する方法、次はtrueを返します。

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');

20122010の後にあるため、trueを返します

7
Eric Leschinski

すべてのデータベースエンジンで機能する共通の構文があるとは思いません。 SQL Serverでは、次のようにします。

AND creation_date BETWEEN DateAdd(dd, -5, GetUtcDate()) AND DateAdd(dd, -15, GetUtcDate())

Oracleについてはよくわかりません...

3
Dean Harding

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を使用した回答は間違っています。

1
Igby Largeman
select * from timing where (db_time < CURRENT_DATE) AND (db_time > (CURRENT_DATE - INTERVAL '1' DAY)) ;
0
Usman

繰り返しますが、これはOracleに固有であり、intimeがTIMESTAMP(3)データ型であると想定すると、これを行うことができます

select * from MYTABLE where intime >= to_timestamp('2014-10-01 7:00:56', 'YYYY-MM-dd HH24:MI:SS')
0
Jonathan L