【问题标题】:Why case statement fails while comparing data?为什么比较数据时case语句会失败?
【发布时间】:2018-10-16 00:55:11
【问题描述】:

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

【问题讨论】:

  • OpeningTime 的数据类型是什么
  • 时间............
  • 您的查询对我有用
  • RegBes 的回答是一个很好的提示,您可能会在 Chanukya 的关于文化相关日期/时间格式的回答下方阅读我的评论...始终尝试将您的数据保存在具有适当格式的列中。对日期值使用字符串格式会减慢查询速度并且是错误的 - 正如您发现的那样......
  • 这是一个案例表达式不是一个陈述

标签: sql sql-server tsql


【解决方案1】:

现在一个答案已被删除 - 我的评论也随之删除...

有几个问题:

  • CONVERT-style 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)

是 4 月 2 日还是 2 月 4 日?

现在尝试对 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;

【讨论】:

    【解决方案2】:

    我怀疑您的 OpeningDate 字段中的某些数据可能不是有效的日期格式。

    运行这个来获取所有可能有问题的记录

    select *
    from works
    where isdate(OpeningDate) = 0 
    

    【讨论】:

    猜你喜欢
    • 2010-09-24
    • 1970-01-01
    • 1970-01-01
    • 2012-04-17
    • 1970-01-01
    • 2021-03-04
    • 1970-01-01
    • 1970-01-01
    • 2013-04-28
    相关资源
    最近更新 更多