我已将 OpeningDate 存储为 varchar(100),将 OpeningTime 存储为表格中的时间。
我已经尝试了一切,但这会引发错误:
从字符串转换日期和/或时间时转换失败。
SELECT CONVERT(VARCHAR(100),CAST(OpeningDate AS DATE),106), --Cast to DATE first to get the style needed
CASE WHEN
( CAST(OpeningDate AS DATETIME)+ -- Cast to DATETIME
CAST(OpeningTime AS DATETIME) -- Also here
) < GETDATE()
THEN 1
ELSE 0 END AS OpeningVaild
FROM Works;
最佳答案
现在一个答案已被删除 - 连同我的评论......
有几个问题:
CONVERT
-样式 106 的意思是dd mon yyyy
。这是您需要的输出格式吗?- 如果您将
2018-04-02
这样的值转换为DATETIME
,这取决于文化。 - 将日期值存储在字符串类型的列中不是一个好主意。这会减慢你的查询速度并且是错误的......
试试这个:
SET LANGUAGE ENGLISH;
SELECT CAST('2018-04-02' AS DATETIME)
SET LANGUAGE GERMAN;
SELECT CAST('2018-04-02' AS DATETIME)
今天是四月二号还是二月四号?
现在尝试同样的方法,将其转换为DATE
...
这有点古怪,但它是遗留问题...使用新格式 DATE
、TIME
和 DATETIME2
可以避免这种情况.
另一种可靠的方法是 ISO8601 格式。这是yyyy-MM-ddTHH:mm:ss
。您可以在任何区域性中将 2018-04-02T12:32:45
之类的字符串转换为 DATETIME
。
当然,您的字符串列中也可能存在无效字符串,例如 2017-02-29
(2017 年没有 2 月 29 日!)或任何类型的垃圾数据...
您可以使用 ISDATE
搜索垃圾数据(请参阅 RegBes 的答案)or you might try TRY_CAST()
(needs v2012+) .
还有一个选项是使用 XML 方法模拟 TRY_CAST
(自 v2005 起):
DECLARE @SomeDates TABLE(d VARCHAR(100));
INSERT INTO @SomeDates VALUES('2018-04-02'),('2017-02-29'),('crap data')
SELECT TRY_CAST(d AS DATE) --needs v2012
,TRY_CONVERT(DATE,d,102) --needs v2012 and allows to specify the mask (102: yyyy.mm.dd)
,(SELECT d FOR XML PATH('x'),TYPE)
.value('(/x/d/text())[1] cast as xs:date?','datetime')
FROM @SomeDates;
关于sql - 为什么比较数据时 case 语句失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52810509/