【发布时间】:2014-10-29 17:16:42
【问题描述】:
我在 SQL Server 2008 中工作。我有一个包含两列存储日期值的表,但列本身是 varchar。 (我知道,这是不好的做法,但我不拥有该表。)这两列中的一些记录是 NULL。我正在尝试对这两列进行比较。所以,为了进行比较,我需要做一个转换。但是,CONVERT 在遇到 NULL 时会失败。我如何从本质上防止 CONVERT 在遇到 NULL 时发生?我的核心查询如下:
SELECT
col1
FROM table_a
WHERE
CONVERT(date, col2, 101) > CONVERT(date, col3, 101)
我尝试了带有 IN 子句的内部查询(即,内部查询仅返回非 NULL 记录),但这失败了,因为查询优化器似乎独立运行这两个查询,即它对所有记录运行 CONVERT ,从而导致失败。我还尝试了自联接(即,仅返回表的第一个实例中的记录,而表的第二个实例中的记录不为空)。但是,由于内部查询场景中的相同问题,这也失败了。
【问题讨论】:
-
where case when col2 is not null then CONVERT(date, col2, 101) end > case when col3 is not null then CONVERT(date, col3, 101) end? -
这不起作用。 SQL 抛出以下错误:从字符串转换日期和/或时间时转换失败。我已经验证(通过 ISDATE),对于填充的记录,值确实是日期。
-
重新转换失败:
ISDATEis not perfect. -
我发现了我的问题。问题出在我的日期值中。对于 col2 和 col3,我必须使用 SUBSTRING 以 YYYY-MM-DD 的形式构造它们。但是,日期样式 101 是 MM/DD/YYYY。所以,我只是更改了我的 SUBSTRING 以生成正确的格式。
标签: sql-server