2017-07-24 104 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!