2013-01-16 81 views
1

我想從VARCHAR(50)轉換爲DATE;只有日期;但它並沒有給我任何結果 然而,這是我所用的語句:解析日期在SQLServer

SELECT COUNT(F0) 
FROM [OriginalData] 
WHERE F1 between Convert(VARCHAR(11),'25/12/1988',103) and 
      convert(VARCHAR(11),'16/01/2013',103) AND F0 = 120002 

它顯示的結果的唯一途徑是當一天串爲01; e.g:

1988年1月1日和2013年1月1日

所以請任何意見,如何從轉換從字符串到日期和比較呢?

+0

你應該儘量避免日期爲附近的任何地方數據庫字符串。他們應該儘可能早地在輸入端進行轉換,並儘可能在輸出端儘可能晚地轉換您編寫的任何應用程序。 –

回答

1

你需要將其轉換這樣

SELECT convert(datetime, '23/07/2009', 103) 

這意味着查詢將

SELECT COUNT(F0) 
FROM [OriginalData] 
WHERE F1 between Convert(datetime,'25/12/1988',103) and 
      convert(datetime,'16/01/2013',103) AND F0 = 120002 

,而不是VARCHAR(11)使用DateTime數據類型轉換時

注意:假設F1是類型datetime


如果VARCHAR的F1數據類型比

SELECT COUNT(F0) 
FROM [OriginalData] 
WHERE Convert(datetime,F1,103) between Convert(datetime,'25/12/1988',103) and 
      convert(datetime,'16/01/2013',103) AND F0 = 120002 

轉換F1也高於查詢喜歡

0

試試這個

CONVERT(DATETIME, '25/12/1988', 101) 
2

假設F1varchar(50),那麼你正在做一個字符串比較。

使用適當的ISO日期...

... 
WHERE CONVERT(date, F1, 112) -- change this to match F1 format 
     BETWEEN CONVERT(date,'19881225',112) and 
       CONVERT(date,'20130116',112) 
     AND F0 = 120002 

注意,這是不是從因爲F1需要CONVERT的索引角度有效。

+0

感謝您的解決方案,我錯過轉換F1在哪裏陳述 – AbuQauod

+0

如果您可以提供幫助,請問有效的方法是什麼? – AbuQauod

+0

@MohammadAbuQauod:1.以日期或日期時間存儲2.使用帶有CONVERT的計算列,添加索引。說,假設(F0,F1)被索引,它可能是「足夠好」... – gbn

0

我認爲,從字符串到日期的CONVER是這樣的:

CONVERT (datetime, '16.01.2013', 103) 

和你正在使用Varchar那裏。

0

您可以使用下面的查詢:

declare @t varchar(100) = '26/12/1988' 

select case 
     when convert(date,@t,103) between Convert(date,'25/12/1988',103) and convert(date,'16/01/2013',103) 
       then @t 
     else 
      'date is not in the specified range'  
     end