sql - 为什么使用日期值时,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
解决方案
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];
推荐阅读
- c# - 需要在数据库中的数据类型为“Int”的情况下获得自动增量
- samba - 安装 samba 的 Ubuntu 18.04 包出现以下错误
- node.js - 隐藏节点红色的流
- deep-learning - 如何在深度学习中获得分类器对测试数据的准确性
- php - 邮件函数总是调用 else 部分
- java - Api返回base64图像字符串作为直接响应而不是json响应如何在androidStudio中处理
- php - ajax调用后VueJS更新数据
- stackexchange.redis - 使用 StackExchange.Redis 进行线程安全发布
- node.js - 如何在nodejs中的where子句中使用and运算符和sequelize
- azure-sql-database - 将一些表从 Azure SQL 导出到 Cosmos DB 以进行 PowerBI 可视化