2013-03-06 36 views
-2

的日期是在2000年的日期字符串格式SQL:如何2日期間查找記錄

如)1120104 = 20120104

運行SQL Server 2008

+4

到底什麼日期爲1120104? – 2013-03-06 17:27:36

+0

你的例子代表什麼日期? – Melanie 2013-03-06 17:28:07

+0

第一位= 2000年後 然後2位數字爲年,月,日 – mechalaris 2013-03-06 17:33:28

回答

1

的第一個忠告:存儲日期數據類型日期或日期時間,以便您可以實際搜索它們。

如果你不希望出現這種情況,您需要將字符串日期先轉換,這樣就可以對它們進行搜索:

where convert(date, my_nasty_string_column_with_dates) between @a and @b 

這是一個PERF的問題,因爲查詢將永遠無法尋求在索引上。

+0

確定。我可以將日期存儲爲數據類型日期。在這種情況下,如何在兩個日期之間搜索?希望這不會搞砸Q&A過程:) – mechalaris 2013-03-06 17:38:35

+0

在這種情況下,只需省略轉換並直接使用'between'。或者使用'col> = @a AND col <= @ b'。就像那樣,沒有魔法介入。 – usr 2013-03-06 17:39:24

3

那麼我同意@usr,首先,停止以這種方式存儲日期。

如果你不能,然後添加一個計算列(其中你甚至可能持續和/或索引):

ALTER TABLE dbo.MyTable ADD RealDate 
AS CONVERT(DATE, RIGHT(col, 6), 12); 

如果你不能做到這一點,然後創建一個視圖:

CREATE VIEW dbo.SmarterView 
AS 
    SELECT /* other columns, */ 
    RealDate = CONVERT(DATE, RIGHT(col, 6), 12) 
    FROM dbo.MyTable; 

然後:

SELECT ... FROM dbo.MyTable -- or dbo.SmarterView 
    WHERE RealDate >= @Start 
    AND RealDate < DATEADD(DAY, 1, @End); 

(開放式範圍遠遠超過BETWEEN更好 - 計算月SUC結束ks,特別是2月份。見http://sqlblog.com/blogs/aaron_bertrand/archive/2011/10/19/what-do-between-and-the-devil-have-in-common.aspx.

如果你在1900年的日期,那麼就稍微有點複雜:

CONVERT(DATE, CONVERT(CHAR(2), 19 + CONVERT(INT, LEFT(col, 1))) + RIGHT(col, 6), 112); 

在任何情況下,這是無關緊要的,因爲OP表示,他們將正確保存它作爲DATE

+0

感謝計算列,你現在可以索引日期。 +1 – usr 2013-03-06 17:40:49

+0

@us好點,添加到身體 – 2013-03-06 17:44:44

+1

將無法​​使用1900年的日期。你正在取消這個世紀。 – 2013-03-06 17:47:10

1

您應該可以在Y2K日期與另一個人進行簡單的等式檢查進行比較。如果你想在2000年至DateTime轉換,那麼你需要增加1900萬,然後將其轉換這樣的例子:

DECLARE @Y2KDate INT 
SET @Y2KDate = 1120104 
DECLARE @DateTime DateTime 
SET @DateTime = CONVERT(DATETIME, CONVERT(CHAR(8), @Y2KDate + 19000000), 112) 
PRINT @DateTime 

輸出以下

1120104 
20120104 
Jan 4 2012 12:00AM