2017-07-24 90 views
2
SELECT 
    CASE WHEN '04/10/2006' < '07/01/2013' THEN 'TRUE' ELSE 'FALSE' 
END 

輸出:TRUESQL服務器 - 日期比較

SELECT 
    CASE WHEN '10/31/2006' > '07/01/2012' THEN 'TRUE' ELSE 'FALSE' 
END 

輸出:TRUE

這是如此混亂。我執行了這兩個查詢,並且對於這兩個查詢都得到了o/p。第一個查詢的o/p是正確的。不應該輸出到第二個查詢是錯誤的。?有人可以幫忙嗎?

+5

你比較字符串,但不是日期。使用DATE或以'YYYY-MM-DD'格式指定字符串。 – dnoeth

+1

你的查詢沒有比較日期,它比較了STRINGS – sepupic

+0

SQL不知道你希望你的日期字符串(即'10/31/2006'')被視爲日期,因此它將它們視爲字符串。明確地將它們轉換爲DATETIME數據類型。 – RBarryYoung

回答

3

這些字符串沒有顯式或隱式轉換爲date數據類型。

唯一真正安全的格式在SQL Server中,至少datetimesmalldatetime,日期/時間文本是:YYYYMMDDYYYY-MM-DDThh:mm:ss[.nnn] - Bad habits to kick : mis-handling date/range queries - Aaron Bertrand

試試這個:

select 
    case 
    when convert(date,'20060410') < convert(date,'20130701') then 'true' 
    else 'false' 
    end 

select 
    case 
    when convert(date,'20061031') > convert(date,'20120701') then 'true' 
    else 'false' 
    end 
1

始終使用標準的日期格式。那你就不會有問題了。我更喜歡YYYY-MM-DD,這將在幾乎所有情況下轉換爲正確的日期(如果你離開了連字符,轉換將永久有效):

select (case '2006-04-10' < '2013-07-01' then 'TRUE' else 'FALSE' 
      end) as output_1 
     (case '2006-10-31 > '2012-07-01' then 'TRUE' else 'FALSE' 
      end) as output_2 

當你使用正確的格式中,比較將作爲字符串或日期。

0

您正在比較字符串而不是日期,因此您首先必須將其轉換爲日期,然後才能比較它。

這是你的問題的解決方案:

選擇 CASE WHEN CAST('10/31/2006' 作爲日期時間)> CAST('07/01/2012' 作爲日期時間)THEN 'TRUE' ELSE 'FALSE' END

Enjoy!