2013-02-27 142 views
7

我有一個以datetime格式存儲數據的列。我想檢查這個列的時間部分不等於00:00:00:000的所有實例 - 日期無關緊要。如何只檢查日期時間字段上的時間,但忽略日期?

基本上,如果時間()是一個功能,是這樣的:

SELECT * 
FROM progen.DY 
WHERE TIME(DY_DATE) <> '00:00:00:000' 

我如何去這樣做呢?

回答

9

你只需要對你已有的東西進行小小的調整。

SELECT * 
FROM progen.DY 
WHERE TIME(DY_DATE) <> '00:00:00:000' 

使用CONVERT更改DATETIMETIME

SELECT * 
FROM progen.DY 
WHERE CONVERT(TIME, DY_DATE) <> '00:00:00:000' 
+0

這種方法是否有任何限制/疑慮?對我來說這似乎很奇怪,如果這真的是最好的方法,這需要很長時間才能提出(基於其他答案)? – Codingo 2013-02-27 06:30:26

+0

@Michael這樣做沒有限制,至少沒有與其他答案相比。在這樣的列上應用函數的壞處是,該列上的任何索引都無法使用,SQL Server必須執行表掃描才能找出需要的行。 – 2013-02-27 06:38:15

3

使用DATEDIFFDATEADD來取代日期時間的日期部分。僅將該列與日期進行比較,它將返回具有非零時間的那些行。

這種方式的工作原理是我們首先計算時期和價值之間的差異(以天爲單位)。我們將該數字添加到時代以創建新的日期時間。由於DATEDIFF的結果是一個整數,因此任何時間組件都會四捨五入。

SELECT * 
FROM Table 
WHERE DateColumn <> DATEADD(d, DATEDIFF(d, 0, DateColumn), 0) 

的時間函數然後可以通過以下來實現,而不是我推薦它的這種特定情況:

SELECT DATEDIFF(minute, DATEADD(d, DATEDIFF(d, 0, DateColumn), 0), DateColumn) as MinutesIntoDay, 
    -- or, if you require higher precision 
    DATEDIFF(second, DATEADD(d, DATEDIFF(d, 0, DateColumn), 0), DateColumn) as MinutesIntoDay 
FROM Table 

編輯:正如在其他的答案中提到,你可以投到DATE達到與DATEADD(d, DATEDIFF(d, 0, DateColumn), 0)相同的效果,清理效果很好。但是,DATE僅在SQL Server 2008中添加,而公式的兼容性至少返回到SQL 2000.因此,如果您需要向後兼容性或正在處理SQL CE,則無法投射到DATE。

2
SELECT * 
FROM progen.DY 
WHERE CONVERT(TIME, DY_DATE - CONVERT(DATE, DY_DATE)) > '00:00' 
3

另一種方法是將其轉換爲不同的數據類型,如

SELECT * 
FROM progen.DY 
WHERE CAST(DY_DATE as float) - CAST(DY_DATE as int) > 0 
2

我這個做想看看錶的列應該是當所有的時間變成日期而不是日期,這真的是答案。

select * 
from progen.dy 
where cast(dy_date as Date) <> dy_date 

鑄造去除時間和日期時間具有較高優先級,所以進行比較時,如果不相等則它有一個時間值。同樣的事情可以通過一次演員來完成,具有一些不同的語法。