将Datetime格式中的NULL值改为空字符串

32 人关注

我有一个表,其中包含'NULL'值,这些值是'Datetime'类型的。现在我必须将这些值转换为空字符串,但是当我使用转换函数时

ISNULL( [Accrued Out of Default] ,'' )

的时候,它把空值变成了'1900-01-01 00:00:00.000'而不是空值。

然后我试着把它们转换为varchar并应用同样的方法。

ISNULL(CONVERT(varchar(50),  [Amort Into Default] ),'')

现在我可以转换为空字符串了,但是现在这些日期时间被转换为字符串,而我需要的是日期时间。 所以我试着用CAST、CONVERT,但它们都不起作用。

CONVERT(Datetime,'ISNULL(CONVERT(varchar(50),  [Amort Into Default] ),'')',120)

这就产生了错误。

是否有任何可能的解决方案。

> **Solution Hi someone answered this to do as.
>      ISNULL(CONVERT(varchar(50),  [Amort Into Default] ,120),'') and it works  I dont know why .
    
2 个评论
在结果集中,一个字段的所有值都必须是相同的数据类型。所以你不能把一些值输出为VARCHAR,而另一些值输出为DATETIME。你应该在客户端进行解析,或者将所有的值输出为VARCHAR类型。
一个 datetime 不能 存储 字符串 。没有办法同时做到:a)结果表达式的类型是 datetime ,b)某行包含有效的日期时间值或NULL以外的东西。
sql-server
sql-server-2008
datetime
Ke7in
Ke7in
发布于 2013-11-12
10 个回答
Bohemian
Bohemian
发布于 2019-03-22
0 人赞同

CASE和CAST应该可以工作。

CASE WHEN mycol IS NULL THEN '' ELSE CONVERT(varchar(50), mycol, 121) END
    
GPH
GPH
发布于 2019-03-22
0 人赞同

使用 ISNULL 是我发现的绕过日期中的 NULL 的最好方法。

ISNULL(CASE WHEN CONVERT(DATE, YOURDate) = '1900-01-01' THEN '' ELSE CONVERT(CHAR(10), YOURDate, 103) END, '') AS [YOUR Date]
    
这对我来说非常有效。我有一些case语句来计算我想要的日期,只是把1900-01-01的日期保留在一个临时表里,然后把这一行应用到临时表的选择中的每一行。我这样做只是因为我的工作只有13个列;除此之外,我还会做其他的事情--它只是更干净,更容易阅读。
为什么要调用两次CONVERT?你只需要评估IS NULL,就像@Bohemian的答案一样
工作得很好。只是必须注意日期格式。
能否在SSIS表达式中使用同样的逻辑? 如果可以,如何制定?
0 人赞同
declare @date datetime; set @date = null
--declare @date datetime; set @date = '2015-01-01'
select coalesce( convert( varchar(10), @date, 103 ), '')
    
Eli
我做了和你类似的事情,不过用ISNULL代替了COALESCE
Eli
Eli
发布于 2019-03-22
0 人赞同

我也有类似的情况,这里是我最后成功使用的(经过编辑的)版本。

ISNULL(CONVERT(VARCHAR(50),[column name goes here],[date style goes here] ),'')

这就是为什么这个方法有效。如果你选择了一个NULL的日期,它将显示为NULL,尽管它实际上被存储为01/01/1900。这就是为什么当你在处理任何日期数据类型时,对日期字段的 ISNULL 不会 将其视为 NULL,因为它在技术上没有被存储为 NULL。

然而,一旦你将其转换为新的数据类型,它将转换为NULL,在这一点上,你的ISNULL将像你期望的那样工作。

我希望这对你来说也是可行的!

更新,近一年后。

我有一个类似的情况,我需要输出为日期数据类型,而我前面提到的解决方案并不奏效(它只在你需要它显示为日期,而不是日期数据类型的情况下奏效。

REPLACE 如果你 需要 它是日期数据类型, 一个办法可以解决,那就是在一个 ISNULL ,下面的方法对我有用。

Select 
    ISNULL(
        REPLACE(
            [DATE COLUMN NAME],
            '1900-01-01',
    '') AS [MeaningfulAlias]
    
Ryan Pratt
Ryan Pratt
发布于 2019-03-22
0 人赞同

这也是可行的。

REPLACE(ISNULL(CONVERT(DATE, @date), ''), '1900-01-01', '') AS 'Your Date Field'
    
欢迎来到Stack Overlow。今后,请考虑多加一点解释。
Jothi Chitrambalam
Jothi Chitrambalam
发布于 2019-03-22
0 人赞同
select case when IsNull(CONVERT(DATE, StartDate),'')='' then 'NA' else Convert(varchar(10),StartDate,121) end from table1
    
请在你的代码中加入解释(而且你可以用四个空格缩进,形成一个代码块)。
mohd imran khan
mohd imran khan
发布于 2019-03-22
0 人赞同
Select isnull(date_column_name,cast('1900-01-01' as DATE)) from table name
    
karthick sridhar
karthick sridhar
发布于 2019-03-22
0 人赞同
declare @mydatetime datetime
set @mydatetime = GETDATE() -- comment out for null value
--set @mydatetime = GETDATE()
select 
case when @mydatetime IS NULL THEN ''
else convert(varchar(20),@mydatetime,120)
end as converted_date

在这个查询中,我计算出的结果来自于当天的当前日期。

ODU90DBA
ODU90DBA
发布于 2019-03-22
0 人赞同

你可以尝试以下方法

case when mydatetime IS NULL THEN '' else convert(varchar(20),@mydatetime,120) 最后作为转换后的日期 从sometable

-- Testing it out could do --
declare @mydatetime datetime
set @mydatetime = GETDATE() -- comment out for null value
--set @mydatetime = GETDATE()
select 
case when @mydatetime IS NULL THEN ''
else convert(varchar(20),@mydatetime,120)
end as converted_date

希望这对你有帮助!

Guest
Guest
发布于 2019-03-22
0 人赞同