私は次のクエリを持っています
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は私を修正します。
日付に関連付けられた時間はありますか? 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をフィールドに追加しました。
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')
どちらのクエリにもエラーはありません。私の推測は次のとおりです。
日付フィールドを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))
)
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