2013-03-05 108 views
0

我有如下表檢查日期時間後的今天上午8點服務器

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.oo後發生的記錄。

爲我做的,如果我跑在updatedDate提到的時間後,該查詢出現問題以下

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

。 在這種情況下LastUpdatedDate > GETDATE()失敗並不返回任何內容。

有關如何解決此問題的任何想法?

+0

可能重複[如何僅返回日期部分從SQL Server日期時間數據類型](http://stackoverflow.com/questions/113045/how-to-return-the-date-part-only-from- a-sql-server-datetime-datatype) – 2013-03-05 04:21:42

+0

是的我正在使用Sql服務器,我不需要日期部分..我也需要檢查時間部分。 – Gautam 2013-03-05 04:22:30

+0

LastUpdatedDate實際上是UpdatedDate在你的表中還是我錯過了什麼?這是一個錯字嗎? – 2013-03-05 04:55:53

回答

1
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小時時鐘格式)

+0

這就像魅力..非常感謝.. – Gautam 2013-03-05 04:26:04

1

dateadd(day, datediff(day, 0, getdate()), 0)會給你今天隨時間部分00:00:00日期。 Useut表示dateadd(hour, 8, ...中的第三個參數,並且您有一個datetime值,其中時間爲08:00:00,您可以使用該值與您的列進行比較。

對列應用函數應儘可能避免,因爲這會使您的查詢Non-Sargable

select * 
from tab 
where UpdatedDate >= dateadd(hour, 8, dateadd(day, datediff(day, 0, getdate()), 0)) 
1

我知道你已經接受了答案,但這樣使用字符串比較是一個非常糟糕的主意 - 它排除使用索引的可能性。

相反,爲什麼不返回值四捨五入從GETDATE()到今天08:00,並直接比較LastUpdatedDate列到:

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

DATEADD/DATEDIFF成對使用,做我以前做的四捨五入描述。他們工作是因爲我使用的兩個日期之間的固定關係。

相關問題