3

2つの日付の間のテーブル内のすべてのレコードを選択したいと思います。私は次のようなクエリを持っています:

SELECT * FROM <table> WHERE (thedate BETWEEN DATE('2012-04-01') AND DATE('2012-06-30'))

これは、HSQL、Oracle、PostgreSQLには問題ありませんが、Date関数がないため、SQLServerでは機能しません。これをすべてのデータベース(SQL Serverを含む)で一般的に機能させる方法はありますか、それともHibernateのようなORMを使用する必要がありますか(必要なことはわかっていますが、SQLでこれを実行できるかどうかを具体的に尋ねています)?

4

2 に答える 2

1

私が知る限り、Date(...)は必要ありません。この例はうまくいくようです

DECLARE @TheDate Date = '2012-07-01';

SELECT 'hello' WHERE (@TheDate BETWEEN '2012-04-01' AND '2012-06-30')
--None returned
SET @TheDate = '2012-05-01'

SELECT 'hello' WHERE (@TheDate BETWEEN '2012-04-01' AND '2012-06-30')
--selects hello

日時の回答でこの質問を見る価値のあるところで編集してください(労力を節約するためにここに投稿します)

betweenステートメントは、日付の範囲境界に関する問題を引き起こす可能性があります。

BETWEEN '01/01/2009' AND '01/31/2009'

本当に次のように解釈されます

BETWEEN '01/01/2009 00:00:00' AND '01/31/2009 00:00:00'

そのため、1月31日の日に発生したものはすべて見逃されます。この場合、以下を使用する必要があります。

myDate >= '01/01/2009 00:00:00' AND myDate < '02/01/2009 00:00:00'  --CORRECT!

また

BETWEEN '01/01/2009 00:00:00' AND '01/31/2009 23:59:59' --WRONG! (see update!)

更新:2009年1月1日23:59:59.997までの日時で、その日の最後の1秒以内にレコードを作成することは完全に可能です!!

このため、このBETWEEN (firstday) AND (lastday 23:59:59)アプローチはお勧めしません。

myDate >= (firstday) AND myDate < (Lastday+1)代わりにアプローチを使用してください。

于 2012-07-28T00:33:00.023 に答える
0

sql-serverで私はあなたが調べたいと思うかもしれないと思います

DATEADD ( datepart , number, date )
DATEDIFF ( datepart , startdate , enddate )

しかし、私はあなたが探していると思います

CAST ( expression AS data_type )

また

CONVERT ( data_type [ ( length ) ] , expression [ , style ] )

利用方法:

Select * from myTable where  thedateToCompare >= CONVERT ( datetime , "dd/mm/yy hh:mi:ss:mmmAM" ) and thedateToCompare <= CONVERT ( datetime , "dd/mm/yy hh:mi:ss:mmmAM" ) 

あなたのアプローチを変えるかもしれない何かはあなたのソース'thedate'列タイプdatetime、smalldatetimeを天気予報するか、それとも文字列として定義された列に保存されますか?

あなたはリンクをチェックしたいかもしれません!文字列のバリエーションに使用できる日時定数の詳細については、こちらをご覧ください。

于 2012-07-28T00:31:55.640 に答える