2009-12-30 147 views
1

我在表中有datecreated字段。它包含值「2009-12-30 11:47:20:297」 我有這樣的查詢:要從日期時間在sql中獲取日期

select * 
    from table 
where DateCreated = getdate() 

雖然今天的日期存在一個行,我沒有同時執行上面得到該行查詢。任何人都可以幫忙嗎?

+1

彼得·迪切科的答案是最好的之一,它允許使用索引。 – 2009-12-30 08:39:44

+0

您可以標記您正在使用的SQL Server版本,因爲SQL 2008具有可投射到的DATE類型。謝謝 – 2011-12-06 00:19:12

回答

3

您的查詢不返回您期望的行的原因是因爲GETDATE()返回執行查詢時的日期和時間部分。 DateCreated列中的值與時間部分不匹配,因此不會返回任何行。

構建查詢的方法有很多,以便根據日期組件評估日期。下面是一個例子:

WHERE YEAR(datecreated) = YEAR(GETDATE()) 
    AND MONTH(datecreated) = MONTH(GETDATE()) 
    AND DAY(datecreated) = DAY(GETDATE()) 

不幸的事實是,使用在柱的功能的任何查詢意味着,如果在列上存在的指標,它不能被使用。

+0

但您可以將YEAR(),MONTH(),DAY()轉換爲表格中的持久計算列,然後將這些列索引...... – 2009-12-30 08:13:01

+1

@marc_s:這聽起來像某個濫用人造鑰匙的人會想出來。 (抱歉,我無法抗拒;))......儘管如此,請看Peter Di Cecco的答案 - 這是最好的答案,爲使用索引提供了機會。 – 2009-12-30 09:00:26

+0

@克雷格:好的,取決於 - 如果你需要例如選擇月份很多次(對於月度報告等),這可能是一個有效的方法 – 2009-12-30 09:34:07

3

您可以使用類似這樣的SQL Server

CREATE FUNCTION [dbo].[udf_DateOnly](@DateTime DATETIME) 
RETURNS DATETIME 
AS 
BEGIN 
    RETURN DATEADD(dd,0, DATEDIFF(dd,0,@DateTime)) 
END 

此行

DATEADD(dd,0, DATEDIFF(dd,0,@DateTime)) 

將剝離出日期部分。

1

您可以通過使用
CONVERT(varchar(8), GETDATE(), 112)

如果需要的話,可以再改回日期時間,因此你會得到一個日期與時間日期時間轉換爲字符串,只有日期,分,秒和毫秒設置爲零。

+0

雖然這個工作,我不會推薦它。首先,內部完成的字符串操作會降低性能。但更重要的是,它會導致開發人員遇到一些不良和潛在危險的習慣。 – 2010-01-11 08:28:51

+0

絕對值得一提。你還可以告訴我使用這種方法的潛在危險是什麼? – Carlos 2010-01-11 09:10:50

2

datetime字段包含日期和時間,精確到毫秒。您的查詢只有在數據庫中存儲的精確毫秒時纔有效。

要檢查,如果它是今天,但忽略了一天的時間,你可以檢查這樣一個範圍:

select * from table where 
DateCreated >= '2009-12-30' and 
DateCreated < '2009-12-31' 

您可以使用結合與轉換的當前日期的功能,如旁觀者或Khilon已發佈。這是一個使用了旁觀者的答案的完整例子。另外,正如克雷格楊指出的那樣,這將與索引一起工作。

select * from table where 
DateCreated >= DATEDIFF(dd,0,GETDATE()) and 
DateCreated < DATEDIFF(dd,0,GETDATE()) 
+1

+1:只是強調一下,範圍必須包含在一邊而不包含在另一邊。即> =和<完全如圖所示。順便說一句,要迂腐,日期時間只有17毫秒左右。 – 2009-12-30 09:06:52

+1

PS:我更喜歡旁觀者的機制,從'GETDATE()'結果中刪除時間。即'DateCreated> = DATEDIFF(dd,0,GETDATE())和DateCreated 2009-12-30 09:24:55

2

最簡單的解決方案可能是:

SELECT CAST(GETDATE() as DATE) 
+0

是的,如果您正在使用SQL Server 2008或更新的DATE數據類型,那麼。 – 2011-04-12 14:53:26

相關問題