我有一個以datetime格式存儲數據的列。我想檢查這個列的時間部分不等於00:00:00:000的所有實例 - 日期無關緊要。如何只檢查日期時間字段上的時間,但忽略日期?
基本上,如果時間()是一個功能,是這樣的:
SELECT *
FROM progen.DY
WHERE TIME(DY_DATE) <> '00:00:00:000'
我如何去這樣做呢?
我有一個以datetime格式存儲數據的列。我想檢查這個列的時間部分不等於00:00:00:000的所有實例 - 日期無關緊要。如何只檢查日期時間字段上的時間,但忽略日期?
基本上,如果時間()是一個功能,是這樣的:
SELECT *
FROM progen.DY
WHERE TIME(DY_DATE) <> '00:00:00:000'
我如何去這樣做呢?
你只需要對你已有的東西進行小小的調整。
SELECT *
FROM progen.DY
WHERE TIME(DY_DATE) <> '00:00:00:000'
使用CONVERT更改DATETIME
到TIME
。
SELECT *
FROM progen.DY
WHERE CONVERT(TIME, DY_DATE) <> '00:00:00:000'
使用DATEDIFF
和DATEADD
來取代日期時間的日期部分。僅將該列與日期進行比較,它將返回具有非零時間的那些行。
這種方式的工作原理是我們首先計算時期和價值之間的差異(以天爲單位)。我們將該數字添加到時代以創建新的日期時間。由於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。
SELECT *
FROM progen.DY
WHERE CONVERT(TIME, DY_DATE - CONVERT(DATE, DY_DATE)) > '00:00'
另一種方法是將其轉換爲不同的數據類型,如
SELECT *
FROM progen.DY
WHERE CAST(DY_DATE as float) - CAST(DY_DATE as int) > 0
我這個做想看看錶的列應該是當所有的時間變成日期而不是日期,這真的是答案。
select *
from progen.dy
where cast(dy_date as Date) <> dy_date
鑄造去除時間和日期時間具有較高優先級,所以進行比較時,如果不相等則它有一個時間值。同樣的事情可以通過一次演員來完成,具有一些不同的語法。
這種方法是否有任何限制/疑慮?對我來說這似乎很奇怪,如果這真的是最好的方法,這需要很長時間才能提出(基於其他答案)? – Codingo 2013-02-27 06:30:26
@Michael這樣做沒有限制,至少沒有與其他答案相比。在這樣的列上應用函數的壞處是,該列上的任何索引都無法使用,SQL Server必須執行表掃描才能找出需要的行。 – 2013-02-27 06:38:15