2016-11-24 13 views
2

午後、月から間違った日付が返されます

私はいくつかの助けを借りてできたSQLサーバーに問題があります。 誤った日付範囲から行を返す日付範囲のselect文を実行すると、

私は、次の

select * from theTable where startDate between '2016-09-01 00:00:00' and '2016-09-08 23:59:59' 

を実行した場合、私はstartDateが第一と9月の8日の間にある行を期待し、私が実際に取得していますと、1月9日と8月9日の間startDate持つ行です。

私は私が使用してdatebaseのためにセットアップされている言語を確認しています

select * from sys.syslanguages order by name where name = @@language 

これは私がのためのデフォルトの言語を確認している英国の

DBCC useroptions戻り

textsize    2147483647 
language    British 
dateformat   dmy 
datefirst   1 
lock_timeout   -1 
quoted_identifier SET 
arithabort   SET 
ansi_null_dflt_on SET 
ansi_warnings  SET 
ansi_padding   SET 
ansi_nulls   SET 
concat_null_yields_null SET 
isolation level   read committed 

を返します。ログインし、これも英国です。私はprint month('2016-09-01 00:00:00')

を実行すると、私は日付と上記の時間はyyyy-mm-dd hh:mi:ss(24h)正規のODBCべきであると誤解していない限り

それは1としませ9.返します。

なぜ9の代わりに1が印刷されるのですか。さらに重要なのはどのように修正するのですか? @@version戻り

Microsoft SQL Server 2005 - 9.00.5057.00 (X64) 
    Mar 25 2011 13:33:31 
    Copyright (c) 1988-2005 Microsoft Corporation 
    Enterprise Edition (64-bit) on Windows NT 5.2 (Build 3790: Service Pack 2) 

を印刷

はあなたの助けをいただき、ありがとうございます。 これは既に答えられている場合は、私はそれを指摘することができます、私は答えを見つけることができません。

+2

明白な形式( 'YYYYMMDD')を使用してください:' startDate> = '20160901'とstartDate <'20160909'' – Lamak

答えて

2

比較的珍しい国際化設定があるようです。デフォルトはYMDではなくYDMです。

あなたは常にハイフンなしの日付を使用することができます。

select * 
from theTable 
where startDate >= '20160901' and 
     startDate < '20160909'; 

これらはは常に SQL ServerでYYYYMMDDように解釈されています。あなたはタイムスタンプがまたあなたのWHERE条件の評価中に考慮されたい場合は

+0

確かに。フランス語の設定では、一般的な例を選択するため、2016年1月9日に '2016-09-01 00:00:00'と解釈されます。 –

-1

、としてあなたの日付を変換してみてください。そう、あなたのクエリになるでしょう

CONVERT(datetime,'2016-09-01 00:00:00',101) 

select * from theTable 
where startDate between 
CONVERT(datetime,'2016-09-01 00:00:00',101) 
and 
CONVERT(datetime,'2016-09-08 23:59:59',101) 

この方法であなたの月[1]の代わりに[9]となり、タイムスタンプも考慮されます。

関連する問題