sql - 为什么比较数据时 case 语句失败?

标签 sql sql-server t-sql

我已将 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...

这有点古怪,但它是遗留问题...使用新格式 DATETIMEDATETIME2 可以避免这种情况.

另一种可靠的方法是 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/

相关文章:

mysql - 在 MYSQL 中,运行多个 AND 检查或转换为 Date 并使用 IN 检查多个日期出现是否会更有效?

c# - SSIS 使用条件拆分或脚本拆分平面文件中的行

mysql - 如何在 MySQL 中存储特定用户的一组信息的多个值?

php - 如何从 Drupal 站点访问单独的 MS SQL 数据库中的数据?

sql - 将 X 个工作日添加到日期

sql - 如何过滤 where 子句中的复合键?

sql - Entity Framework 数据库查询非常慢

sql - SQL Server 中的货币舍入方式

c# - 使用 pivot 将行转换为列

mysql - SQL - 分组依据上的用户相关行