首页 > 解决方案 > 为什么使用日期值时,IIF 和 ISNULL 的返回结果与我的预期不符?

问题描述

我正在尝试使用 IIF() 将列的强制转换作为日期返回,但前提是该值不是空白字符串 [这些值未在我正在使用的数据库中存储为空值]。

我尝试使用 ISNULL 作为更好的中介,但由于日期返回为 1900-01-01,它无法正常工作。它似乎适用于其他数据类型(int)。

示例表

CREATE TABLE #temp_test (
[reg_dt] varchar(10)
)
insert into #temp_test SELECT ''
insert into #temp_test SELECT ''
insert into #temp_test SELECT ''
insert into #temp_test SELECT ''
INSERT INTO #temp_test select '20080509'
select * from #temp_test

IIF 测试示例(似乎功能正常,我也测试了 inverse ='', 'false', 'true');当我取消注释 try_convert 并删除“true”时,遇到错误

SELECT IIF([reg_dt] != '', 'true'
       --TRY_CONVERT(date, [reg_dt], 112)
       , 'false') [reg_dt]
FROM   [#temp_test];

ISNULL 示例(返回 1900-01-01)

SELECT ISNULL(TRY_CONVERT( DATE, [reg_dt], 112), '') [reg_dt] from [#temp_test]

如果现有值为空白,我希望输出为空白值,如果不是,则返回日期值。我认为在检查空值之前转换为日期可能是最好的,因为如果传递了无效的日期(例如 2019 年 4 月 31 日),那么它将被转换为空白值,这是这种情况下的首选功能。

下面的代码确实有效,但我真的不确定这是否是最好的方法。

select ISNULL(NULLIF(CONVERT(VARCHAR(10), CAST([reg_dt] as date), 112), '19000101'), '') as [reg_dt] from #temp_test

标签: sqlsql-server

解决方案


NULL 不等于空字符串。空字符串转换为有效日期“1900-01-01”。如果你想有 NULL,你需要指定 NULL。

顺便说一句,与 NULL 的比较不会返回 true 或 false。它将返回未知。

这是一个基于你的例子。

CREATE TABLE #temp_test (
[reg_dt] varchar(10)
)
insert into #temp_test SELECT ''
insert into #temp_test SELECT NULL
INSERT INTO #temp_test select '20080509'

SELECT IIF([reg_dt] != '', 'true', 'false') [reg_dt]
FROM   [#temp_test];

SELECT [reg_dt],
    TRY_CONVERT( DATE, [reg_dt], 112) [converted_reg_dt],
    ISNULL(TRY_CONVERT( DATE, [reg_dt], 112), '') [formatted_reg_dt] 
from [#temp_test];

推荐阅读