Sql server 如何在MS SQL中将空日期编码为空

Sql server 如何在MS SQL中将空日期编码为空,sql-server,Sql Server,我有列/行值的下表: tbl1 ID 1 2 3 tbl2 ID Color DateRegister 1 'Red' '2021-02-04 00:00:00.000' 3 'Blue' '2021-02-04 00:00:00.000' 我试图编写一个SQL代码,通过左连接从tbl1和tbl2中选择记录。如果tbl1和tbl2之间没有连接的记录,则tbl2列应为空。我使用CASE为空值显示空白字符串。这不适用于日期列 SELECT tbl1.ID

我有列/行值的下表:

tbl1
ID
1
2
3

tbl2
ID    Color    DateRegister
1     'Red'     '2021-02-04 00:00:00.000'
3     'Blue'    '2021-02-04 00:00:00.000'
我试图编写一个SQL代码,通过左连接从tbl1和tbl2中选择记录。如果tbl1和tbl2之间没有连接的记录,则tbl2列应为空。我使用CASE为空值显示空白字符串。这不适用于日期列

SELECT
tbl1.ID
, CASE WHEN tbl2.Color IS NULL THEN ''  ELSE tbl2.Color END AS 'Batch-Color'
, tbl2.DateRegister as 'Date-1'
, CASE WHEN tbl2.DateRegister IS NULL  THEN '' ELSE WHEN tbl2.DateRegister END AS 'Batch-Date'
FROM tbl1 LEFT JOIN tbl2 ON tbl1.ID = tbl2.ID
这是输出。我需要将日期显示为空白字符串,而不是“1900-01-01”

ID    Batch-Color    Date-1                      Batch-Date
1     'Red'          '2021-05-28 00:00:00.000'   '2021-05-28 00:00:00.000'
2     ''             NULL                        '1900-01-01 00:00:00.000'
3     'Blue'         '2021-02-04 00:00:00.000'   '2021-02-04 00:00:00.000'

您需要<代码> Case<代码>您的日期到<代码> VARCHAR < /代码>,否则空白字符串将被隐式地转换为<代码>日期<代码>,因此您的1900—01-01.

尝试以下模式:

select... coalesce(convert(varchar(25),[Batch-Date]),'')...

您必须使用style=
121
DateRegister
转换为
VARCHAR
(以保留所需的格式)。
另外,使用
COALESCE()
比使用
大小写表达式更简单:


请参阅。

最好的方法是简单地保留
NULL
值,并让您的客户机代码根据需要对其进行格式化。如果将日期转换为空白,还必须决定使用何种格式来转换非
NULL
——依赖服务器基于区域设置隐式生成的日期是个坏主意。完全同意上述评论<代码>'
根据定义不是日期,您不能在SQL中的日期和时间列中存储或解析非日期值;列必须是单个强类型数据类型。将它留给您的表示层,以空白值显示
NULL
,而不是RDBMS。使用不带长度的
VARCHAR
是一个。@Jeroenmoster是的,我必须计数,最多23个。这对我来说很有效。我得到了我需要的结果。非常感谢。:-)
SELECT tbl1.ID, 
       COALESCE(tbl2.Color, '') AS [Batch-Color],
       tbl2.DateRegister AS [Date-1],
       COALESCE(CONVERT(VARCHAR(23), tbl2.DateRegister, 121), '') AS [Batch-Date]
FROM tbl1 LEFT JOIN tbl2 
ON tbl1.ID = tbl2.ID