web-dev-qa-db-ja.com

SQL Serverで日時BETWEENステートメントが機能しない

私は次のクエリを持っています

SELECT * FROM LOGS 
WHERE CHECK_IN BETWEEN CONVERT(datetime,'2013-10-17') AND CONVERT(datetime,'2013-10-18')

このクエリは結果を返しませんが、次のクエリは結果を返します。

SELECT * FROM LOGS WHERE CHECK_IN >= CONVERT(datetime,'2013-10-17')

最初のクエリが結果を返さないのはなぜですか?私が何か間違いをした場合、plsは私を修正します。

13
Able Alias

日付に関連付けられた時間はありますか? BETWEENは包括的ですが、2013-10-18を日付に変換すると2013-10-18 00:00:000.00になります。時間の値を含めない限り、BETWEENを使用して18日の最初の2秒以降に記録されるものは表示されません。

試してください:

SELECT * FROM LOGS WHERE CHECK_IN BETWEEN CONVERT(datetime,'2013-10-17') AND CONVERT(datetime,'2013-10-18 23:59:59:999')

18日全体を検索する場合。

SQL DATETIMEフィールドにはミリ秒があります。そこで、999をフィールドに追加しました。

39
Skerkles

2番目のクエリは17日からの結果を返しますか、それとも18日からの結果を返しますか?

最初のクエリは、17日または18日の午前0時からの結果のみを返します。

代わりにこれを試してください

select * 
from LOGS 
where check_in >= CONVERT(datetime,'2013-10-17') 
and check_in< CONVERT(datetime,'2013-10-19')
5
podiluska

どちらのクエリにもエラーはありません。私の推測は次のとおりです。

  • 2013-10-17 'と' 2013-10-18 'の間にレコードは存在しません
  • 2番目のクエリが返すレコードは、「2013-10-18」の後に存在します
2
apomene

日付フィールドをvarcharに変換して時間を取り除き、それを再びdatetimeに変換する必要があります。これにより、時間は'00:00:00.000 'にリセットされます。

SELECT *
FROM [TableName]
WHERE
    (
        convert(datetime,convert(varchar,GETDATE(),1)) 

        between 

        convert(datetime,convert(varchar,[StartDate],1)) 

        and  

        convert(datetime,convert(varchar,[EndDate],1))
    )
0
NetIntel

Sql Server 2008からは、「日付」形式があります。

使用できます

SELECT * FROM LOGS WHERE CONVERT(date,[CHECK_IN]) BETWEEN '2013-10-18' AND '2013-10-18'

https://docs.Microsoft.com/en-us/sql/t-sql/data-types/date-transact-sql

0
maurox