我正在尝试将列值转换为datetime。
CONVERT(日期时间,ColName,105(
这会将所有空白值转换为默认值1900-01-01 00:00:00.000。我也想在转换后保留空白值。
如果ColName只包含空(var(字符值,则可以像一样将NULLIF添加到ColName
CONVERT(datetime, NULLIF(ColName, ''),105)
如果您要转换为DATETIME,则不能有"空白"值,但可以使用NULL:
CASE WHEN ColName IS NULL OR LEN(LTRIM(ColName)) = 0 THEN NULL ELSE CONVERT(DATETIME, ColName, 105) END
这会将任何NULL、空白字符串或空白转换为NULL DATETIME,并将其他所有内容转换为带值的DATETIME(假设它是有效日期(。
空白值将转换为SQL server默认日期时间值。以下查询将帮助您不要转换空白值。但是,最好使用NULL而不是">
SELECT CASE WHEN NULLIF(COLUMN,'') = NULL THEN
NULL
ELSE CONVERT(datetime, dd,105) END
FROM <TABLE>
首先,将日期存储为字符串并使用空字符串表示缺失的值是非常糟糕的想法。通过将该字段转换为可为null的date
或datetime
,可以一劳永逸地解决该问题。
在完成之前,或者为了方便起见,您可以使用所有支持的SQL Server版本上提供的TRY_PARSE函数。支持的最早SQL Server版本是2012。105是意大利格式,所以:
SELECT TRY_PARSE(ColName as datetime USING 'it')
例如
select try_parse( '13-11-2018' as datetime USING 'it')
将字符串值解析为值为2018-11-13 00:00:00.000
的datetime
。任何无法解析的内容都将返回NULL:
select try_parse( '' as datetime USING 'it')
将返回NULL
。
在早期版本中,可以使用CASE WHEN
或等效的IIF
:
select IIF(TRIM(ColName)='',NULL,CONVERT(datetime, ColName,105))
返回NULL是唯一的选项,因为date
、datetime
等日期类型与int
或decimal
一样都是标量类型。没有空的日期或日期时间。唯一的可能性是对缺失的值或实际日期使用NULL。
试图返回某种空白值意味着必须将日期转换回字符串。