2016-09-07 96 views
0
IF('08/30/2015'>'08/29/2016') 
SELECT '1' 
ELSE 
SELECT '0' 

此SQL語句返回1,因爲它僅比較每月和每天並忽略年份。我知道我正在比較兩個varchar值 - 不是日期 - 但我想知道該比較的SQL遵循的邏輯是什麼?varchar格式的日期比較

有人可以幫我嗎?同樣的情況在一個項目中給了我一個問題,我通過投射到目前爲止修復了這個問題。但是,我想知道這背後的邏輯。我搜查了它,但沒有找到合適的解釋。

+2

它比較他們作爲字符串,自然。它將逐個字符進行比較,第一個不同的是3對2,3大於2,因此結果爲1. –

回答

0

它比較兩個字符串,所以即使人類會查看這些並考慮日期,SQL只會看到一個字符串比另一個更大。如果你拿出斜槓並且只是把數字放在那裏,它可能會更有意義:08302015 > 08292016

+0

這不起作用,因爲它會在一年前的月份和日期進行排序(即在你的例子,2015年是不是真的比2016年大,是嗎?) – Ben

+0

@Ben我並不是建議這是一個計算,而是回答他的問題,比較所提出的值時邏輯是如何工作的。他已經表示,他通過演員得到了正確解決的日期,問題是爲什麼絃樂會按照他們的方式進行計算。將這些斜線取出可能會讓人更清楚,這正是我試圖傳達的信息。也許你應該更仔細地閱讀這個問題。 – morgb

+0

糟糕。我的錯。所以不會讓我刪除我的downvote。對於那個很抱歉。 – Ben

4

您的值不是日期。他們是字符串。你可以這樣做:

IF (convert(date, '08/30/2015') > convert(date, '08/29/2016')) 
    SELECT '1' 
ELSE 
    SELECT '0'; 

(注:這是否工作取決於該日期格式的國際化設置,我認爲是建立理解MDY格式。)

但何必呢?只需使用ISO標準日期格式(YYYY-MM-DD):

IF ('2015-08-30' > '2015-08-29') 
    SELECT '1' 
ELSE 
    SELECT '0'; 

這些不需要轉換,因爲字符串比較正確。