我意识到还有其他线程可以解决这个问题,但我找不到解决问题的方法。
我有三个文本列,其中包含日期或没有任何内容(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”格式的日期的文本字段。
我是否应该转换回文本格式以允许''显示空白 - 如果是这样,日期是否仍会被识别为日期?
答案 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数据透视表,因此无需解决此问题,因为数据透视表无论如何都会消除空值。
......如果我需要在列表中显示数据,我可能会回到这里。
感谢所有提出建议的人!