【发布时间】:2019-05-03 14:30:30
【问题描述】:
我正在尝试使用 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
【问题讨论】:
-
不存在作为日期的空白字符串。当您将空字符串传递给日期时间时,它将执行隐式转换并获得 1900-01-01。如果你真的想要空字符串,你将不得不使用字符数据,而不是日期。实际上,您应该对日期使用正确的数据类型而不是 varchar。
-
嗨,肖恩 - 正在传递的数据都是 varchar,我正在尝试成功转换它,这就是我遇到这个问题的方式。我在下面评论(并且应该编辑我的主要内容)选择 ISNULL(NULLIF(CONVERT(VARCHAR(10), CAST([reg_dt] as date), 112), '19000101'), '') as [reg_dt] from #temp_test 有效,但我不明白这是否真的是最好的方法。因为正如您所确认的那样,行为正在将 '' 更改为 1900-01-01,所以我想这就是我在这种情况下必须检测到的?如果我从头开始设计,我永远不会接受所有 varchar 数据。
标签: sql sql-server