试图从转换日期列中删除“1900-01-01”

时间:2018-06-12 15:04:21

标签: sql sql-server tsql sql-server-2012

我意识到还有其他线程可以解决这个问题,但我找不到解决问题的方法。

我有三个文本列,其中包含日期或没有任何内容(null),我将文本转换为日期,以便在日期转换为Excel时使用日期过滤器。

显然,null值会转换为'1900-01-01'但我无法找到将它们显示为空白的方法,即使使用子查询也是如此。

这就是我正在做的......

Select top 999999999
OtherFields,

case when Engdate = '19000101' then '' else Engdate end as 'EngDate',

OtherOtherFields

from
(

select 
OtherFields,

case 
when VAR_AppID = '3' then nullif( CONVERT(date,concat(right([2201],4), 
SUBSTRING([2201],4,2), left([2201],2))),null)
        else nullif( CONVERT(date,concat(right([3429],4), 
SUBSTRING([3429],4,2), left([3429],2))),null) end as 'Engdate',

case when ([2201] is not null and Len([2201])  = 10 ) then 
CONVERT(date,concat(right([2201],4), SUBSTRING([2201],4,2), left([2201],2)))
else null end as 'EngagementRec',

OtherOtherFields

from

Tables
)

字段[2201]和[3429]是包含“dd / mm / yyyy”格式的日期的文本字段。

我是否应该转换回文本格式以允许''显示空白 - 如果是这样,日期是否仍会被识别为日期?

5 个答案:

答案 0 :(得分:1)

根据Anthony Green在sqlservercentral上的回答,您可以尝试:

ISNULL(CONVERT(varchar, DateTimeColumnName,23),'') as DateTimeColumnName

答案 1 :(得分:0)

根据Concat功能的ms帮助(sql 2012起,而不是2008) https://docs.microsoft.com/en-us/sql/t-sql/functions/concat-transact-sql?view=sql-server-2017

  

如果CONCAT收到带有所有NULL值的参数,它将返回一个空值   varchar(1)类型的字符串。

零长度字符串将隐式转换为零,从而在sql server中为零日期。在尝试转换完成它之前,您需要处理空值。 也许使用Try_convert代替。 使用带有正确选项的try_convert。 TRY_CONVERT(Datetime,columnwithstringdate,103)

答案 2 :(得分:0)

是的,首先转换它们的文本不会有任何不好(我认为)。 请尝试以下方法:

Select top 999999999
OtherFields,

case when Engdate = '19000101' then '' else CONVERT(CHAR(10), EngDate, 120) end as 'EngDate' end as 'EngDate',

OtherOtherFields

from
(

select 
OtherFields,

case 
when VAR_AppID = '3' then nullif( CONVERT(date,concat(right([2201],4), 
SUBSTRING([2201],4,2), left([2201],2))),null)
        else nullif( CONVERT(date,concat(right([3429],4), 
SUBSTRING([3429],4,2), left([3429],2))),null) end as 'Engdate',

case when ([2201] is not null and Len([2201])  = 10 ) then 
CONVERT(date,concat(right([2201],4), SUBSTRING([2201],4,2), left([2201],2)))
else null end as 'EngagementRec',

OtherOtherFields

from

Tables
)

感谢。

答案 3 :(得分:0)

如您所知,将空字符串转换为date数据类型将返回1900-01-01。

示例SQL:

SELECT CAST ('' as date) AS [thedate]

返回:

thedate
1900-01-01

当转换为date数据类型时,NULL值仍为NULL。 根据您的代码,我认为您所要做的就是改变这一行:

case when Engdate = '19000101' then '' else Engdate end as 'EngDate',

为:

case when Engdate = '19000101' then NULL else Engdate end as 'EngDate',

答案 4 :(得分:0)

我自己关闭这个,因为我无法找到有效的方法。 案例陈述,ISNULL(),NULLIF()等的任何组合都会导致NULL或' 1900-01-01'。转换为文本会使日期字段在Excel中无法使用。

由于数据将进入Excel数据透视表,因此无需解决此问题,因为数据透视表无论如何都会消除空值。

......如果我需要在列表中显示数据,我可能会回到这里。

感谢所有提出建议的人!