2014-10-01 58 views
0

我在Sql Server中僅選擇DateTime中的日期部分。Sql Server從DateTime中只選擇日期部分

DateTime的值是2014-05-01 00:00:00.000。

如果嘗試此查詢我沒有錯誤,輸出是否正確:

SELECT CONVERT(VARCHAR(10),'2014-05-01 00:00:00.000',110) 
2014-05-01 

如果試圖在此doTable其他查詢:

SELECT 
    TOP 100 * 
FROM 
    [n].[a2].[DOTABLE] 
WHERE 
    CONVERT(VARCHAR(10),data,110) > DATEADD(DAY, - 1, getdate()) 
ORDER BY 
    data DESC; 

我有這樣的錯誤:

SQL Server Error Messages - Msg 242 - 
The conversion of a char data type to a datetime data type 
resulted in an out-of-range datetime value. 

SQL服務器的版本是:

Microsoft SQL Server 2005 - 9.00.1399.06 (Intel X86)   
Oct 14 2005 00:33:37   
Copyright (c) 1988-2005 Microsoft Corporation  
Standard Edition on Windows NT 6.1 (Build 7600:) 

我想我做得不對,但我知道爲什麼。

+0

數據列中存儲日期的格式是什麼? – jpw 2014-10-01 11:39:09

+0

存儲在數據列中日期的格式是datetime – 2014-10-01 11:40:41

回答

1

我認爲下面是一個更好的方式做你想要什麼:

where date >= dateadd(day, 0, datediff(day, 0, getdate()) - 1) 

這截斷當前日期到昨天午夜,我猜是什麼你真的想要。

對於你的方法,嘗試使用格式120:

SELECT TOP 100 * 
FROM [n].[a2].[DOTABLE] 
WHERE CONVERT(VARCHAR(10), data, 120) > DATEADD(DAY, - 1, getdate()) 
ORDER BY data DESC; 

可以兩邊做到這一點:

SELECT TOP 100 * 
FROM [n].[a2].[DOTABLE] 
WHERE CONVERT(VARCHAR(10), data, 120) > CONVERT(varchar(10), DATEADD(DAY, - 1, getdate()), 120) 
ORDER BY data DESC; 

這種格式是YYYY-MM-DD這是比較有用的。

然後,升級SQL Server,並使用date數據類型。

+0

謝謝,但您的查詢輸出爲空,但我在具有數據的可點記錄中'2014-09-30 00 :00:00.000' – 2014-10-01 11:45:22

+0

@AntonioMailtraq。 。 。我沒有看到我的答案中有什麼影響。 – 2014-10-01 11:47:23

+0

我個人喜歡dateadd/datediff方法,並經常使用它。子串對這種事情感覺很髒。 – md4 2014-10-01 11:58:55

-1

爲什麼要將日期轉換爲varchar?

嘗試此查詢

SELECT TOP 100 * 
FROM [n].[a2].[DOTABLE] 
WHERE data > DATEADD(DAY, - 1, getdate()) 
ORDER BY data DESC; 
+0

謝謝,但是你的查詢輸出爲空,但是我在可數記錄中有數據'2014-09-30 00:00:00.000' – 2014-10-01 11:42:58

+0

@AntonioMailtraq如果你必須在00:00:00.000之間捕捉日期,您可以將condtition更改爲> =或將getdate()更改爲CURRENT_TIMESTAMP – 2014-10-01 11:48:17

0

在SQL Server 2008中驗證了您的查詢。它運行良好可能是SQL Server 2005與varchar和date time之間的轉換相關的特定問題。

您可以添加顯式轉換到這裏日期類型

SELECT 
    TOP 100 * 
FROM 
    [n].[a2].[DOTABLE] 
WHERE 
    CAST(CONVERT(VARCHAR(10),data,110) as datetime) > DATEADD(DAY, - 1, getdate()) 

ORDER BY 
    data DESC; 
0

我的建議是使用下面的轉換零出你不requre日期部分(在這種情況下時間):

declare @n int = datediff(day, 0, [some_datetime_col]); 

以上部分將返回自SQL Server時代以來的天數,作爲整數。然後,玩完轉換:

select dateadd(day, @n, 0); 

這增加了回該天數,返回一個datetime沒有時間部分。將它應用到你的例子:

where 
    datediff(day, 0, data) > (datediff(day, 0, getdate()) - 1) 

在你的情況,你不需要做轉換回datetime,因爲它只是一個where條款;您可以非常有效地比較整數並獲得相同的結果。

這種方法的附加好處是,您可以輕鬆地將它應用到幾個月(例如獲取月的第一天)和年。需要更多的關注與數週,但這超出了這個答案的範圍。