0

私は次の表を持っています

ID      UpdatedDate
---     ------------
1   2013-03-04 08:05:07.203
2   2013-03-04 07:05:07.203
3   2013-03-05 10:05:07.203

今日は午前8時以降にのみ発生するレコードのみを表示したいと思います。

そのために私は次のようにやっています

select * from tab
where 
LastUpdatedDate > GETDATE()
and datepart(hh, LastUpdatedDate) >= 8

この問題は、updatedDateに記載されている時間の後にこのクエリを実行すると発生します。その場合、LastUpdatedDate > GETDATE()失敗して何も返されません。

この問題を解決する方法について何かアイデアはありますか?

4

3 に答える 3

2
select * from tab
where 
    convert(varchar(11),LastUpdatedDate,101) > convert(varchar(11),getdate(),101)
and 
    convert(varchar(11),LastUpdatedDate,108) >= '08:00:000'

101 - 日付部分の抽出
108 - 時刻部分の抽出
(24 時間形式)

于 2013-03-05T04:22:16.277 に答える
1

すでに回答を受け入れていることは知っていますが、文字列比較を使用してこれを行うのは非常に悪い考えです。インデックスを使用する可能性を排除します。

代わりに、戻り値を今日の 08:00 に丸め、列をGETDATE()それと直接比較してみませんか。LastUpdatedDate

select * from tab
where 
    LastUpdatedDate >=
       DATEADD(day,DATEDIFF(day,'20010101',GETDATE()),'2001-01-01T08:00:00')

DATEADD/のDATEDIFFペアは、説明した丸めを行うために使用されます。私が使用している2つの日付の間の固定関係のために、それらは機能します。

于 2013-03-05T07:35:33.903 に答える
1

dateadd(day, datediff(day, 0, getdate()), 0)今日の日付と時刻の部分が表示され00:00:00ます。3 番目のパラメーターを使用すると、列との比較に使用できる時間dateadd(hour, 8, ...datetime値が得られます。08:00:00

関数を列に適用することは、クエリがNon-Sargableになるため、可能であれば常に避ける必要があります。

select *
from tab
where UpdatedDate >= dateadd(hour, 8, dateadd(day, datediff(day, 0, getdate()), 0))
于 2013-03-05T06:16:04.100 に答える