2017-10-19 11 views
0

DD/MM/YYYYの形式で指定された日付の範囲を使用して日付/時刻フィールドを照会します。SQL Server - DD/MM/YYYYタイプの2つの日付の間で選択します

私は私が使用できるDD/MM/YYYY形式に日時を変換することを知っている:例えば、

CONVERT(CARCHAR(10), ORDERDATE,103)` 

そして、単一の日付を照会するとき、これは正常に動作します:

SELECT DISTINCT 
CONVERT(DATE, ORDERDATE), 
CONVERT(CARCHAR(10), ORDERDATE,103) 
FROM ORDERS 
WHERE CONVERT(CARCHAR(10), ORDERDATE,103) = '19/10/2017' 

戻り値を:2017-10-19, 19/10/2017

それは、範囲の日付の、例えば上では動作しません。しかし:

WHERE CONVERT(CARCHAR(10), ORDERDATE,103) BETWEEN '17/10/2017' AND '19/10/2017' 

戻り値:

2014-02-05 
2016-12-12 
2013-04-30 

私は、SQLの日付についてのスレッドの何百もある知っているが、それらはすべての出力を再フォーマットに関する入力の準備ではないように見えます。 DD/MM/YYYY入力を再フォーマットする必要がありますか?

+4

'date'を' char'/'varchar'に変換するのではなく、' char'/'varchar'入力を' date'に変換して比較するべきです。 – gmiley

+0

dd/mm/yyyyのような 'type'はありません。日付は...「日付」です。 –

+0

はい彼らは 'タイプ' DD/MM/YYYYではありません申し訳ありませんが、それらは 'フォーマット' DD/MM/YYYYにあります。 – Needaf1x

答えて

2

日付の範囲をクエリするには、VARCHARの代わりにDATE -datatypeを使用します。

カラムORDERDATEのデータ型はDATETIMEである場合:

WHERE CONVERT(DATE, ORDERDATE) BETWEEN 
CONVERT(DATE, '17/10/2017', 103) AND CONVERT(DATE, '19/10/2017', 103) 

開始日と終了日が同じ場合ORDERDATEの変換はのみ必要です。 (何の変換は行われませんこの場合には、唯一の00の時間値を日付:00:00.000' が返されますが)

EDIT:
あなたが時間を追加することができますORDERDATEの変換を省略します日付にこのようなDATETIME代わりのDATEに変換:

WHERE ORDERDATE BETWEEN 
CONVERT(DATETIME, '19/10/2017 00:00:00') AND CONVERT(DATETIME, '19/10/2017 23:59:59.999'); 

、あるいは単純に、@ Used_By_Alreadyの答えで提案されているように:

WHERE ORDERDATE >= '20171017' AND ORDERDATE < '20171020' --Note the end date is here +1 day 
+0

スタイル番号を省略すると 'CONVERT(日付、'17/10/2017 ')'が失敗する可能性があります。 –

+0

@Used_By_Already Agree、編集済みの回答 – MatSnow

+0

なぜ変換しますか?ゼロ付加価値、最適化とインデックスを無効にする –

2

SQL Server 日付情報を「形式」で保存しないでください。文字通りその形式で保存されていれば、データベースに関する限り日付ではなく(日付のような文字列です)、DD/MM/YYYYの場合は対処しなければならないでしょう。彼らは単に日付のように振る舞いません。

は、日付/時刻情報(日時、DATETIME2、SMALLDATETIME、日付、時間)が、これらのすべてが、全く人間が読める形式でデータを格納しないためのSQL Serverでいくつかの特定ののデータタイプがあります。代わりにが数字のグループとして格納されています。これは人間が読める形式で表示され、デフォルトではDD/MM/YYYY形式で表示されます。中国のユーザーは、YYYY.MM.DDまたは米国の日付をMM/DD/YYYYとして表示することをお勧めします。これは、表示される前に保存されている数字の上に人間の書式が適用されているために可能です。

So. SQL Serverでは文字通りの「安全」の日付は、「YYYYMMDD」の形式であり、これは変換する必要があるか、CASTせずに使用することができる。

あなた[ORDERDATE]列が日付(またはsmalldatetime型/ datetime型であるのIF /あなたは明示的に文字列に変換することができますが、「スタイルナンバーが」これらは完全に信頼性を高めるために存在する必要があり、

WHERE ORDERDATE BETWEEN '20171017' AND '20171019' 

をOR:DATETIME2)、これは動作します。 「間」ではなく、「間」を使用しないことです日付の範囲を形成する、はるかに信頼性の高い方法上記の説明で使用される、このようにそれを行うにしてきたが例えばスタイル103はDD/MM/YYYY

WHERE ORDERDATE BETWEEN CONVERT(date, '17/10/2017',103) AND CONVERT(date, '19/10/2017',103) 

のためであります:このパターンでは

WHERE ORDERDATE >= '20171017' AND ORDERDATE < '20171020' 

(二日目は、現在1であることに注意)、列に格納されている日付の精度は重要ではありません。 Bad habits to kick : mis-handling date/range queries

+0

「20171017」の正しいスタイル番号は「112」でなく「103」です。 https://docs.microsoft.com/en-us/sql/t-sql/functions/cast-and-convert-transact-sql – MatSnow

+0

私の証明の読み込みに失敗したため、私は特にdd/mm/yyyを使用しようとしていました(現在は固定されています)。 nb YYYMMDDリテラル(スタイル112)を使用している場合、明示的に変換する必要はありません(最初の例のように) –

+0

最後の例だけが動作します。 'ORDERDATE'はデータ型' DATETIME'であるため、時刻値が'00:00:00.000 'の日付のみが返されます – MatSnow

関連する問題