在SQL Server中,ISNULL()函数必须具有相同类型的参数。
check_expression
是否要检查表达式是否为NULL。 check_expression可以是 任何类型。
replacement_value
如果check_expression为NULL,则返回表达式。 replacement_value 必须与check_expresssion 具有相同的类型。
如何将其与不同类型的参数一起使用?我希望使用date
和string
参数,例如ISNULL(A.DATE, '-')
注意:A.DATE
的类型为datetime
。
EDIT-1 :我的完整查询获得0行:
SELECT A.pkey as KREDİ, A.SUMMARY , D.BayiStatu AS STATU, D.Sorumlu AS SORUMLU, C.BayiSonuc as SONUC, ISNULL( CONVERT(VARCHAR(25), A.CREATED, 112) , '-' ), ISNULL( CONVERT(VARCHAR(25), A.RESOLUTIONDATE, 112) , '-' ), dbo.CUSTVAL(11931, A.ID, 'S') AS BAYİ, ISNULL( CONVERT(VARCHAR(25), dbo.GetLastStatuTime(A.ID), 112) , '-' ) AS SON_STATU_TAR,j2.SUMMARY, ISNULL( CONVERT(VARCHAR(25), j2.CREATED, 112) , '-' ), ISNULL( CONVERT(VARCHAR(25), j2.RESOLUTIONDATE, 112) , '-' ), j3.SUMMARY, ISNULL( CONVERT(VARCHAR(25), j3.CREATED, 112) , '-' ), ISNULL( CONVERT(VARCHAR(25), j3.RESOLUTIONDATE, 112) , '-' )
FROM AspNetServicesDB.dbo.SONUC_MAP C, JİRA.resolution E, jira.issuestatus B, AspNetServicesDB.dbo.STATU_MAP D, Jira.jiraissue A
INNER JOIN Jira.issuelink i
ON i.SOURCE = A.ID and i.SEQUENCE = 0
INNER JOIN Jira.jiraissue As j2
ON i.DESTINATION =j2.ID
LEFT JOIN Jira.issuelink i2
ON i2.SOURCE = A.ID and i2.SEQUENCE = 1
LEFT JOIN Jira.jiraissue As j3
ON i2.DESTINATION = j3.ID
WHERE A.issuestatus = B.ID
AND 'BAŞARAN OTOMATİV' = dbo.CUSTVAL(11931, A.ID, 'S')
AND B.pname = D.JiraStatu collate Turkish_CS_AI
AND A.issuetype != 11
AND A.RESOLUTION = E.ID
AND E.pname = C.JiraSonuc collate Turkish_CS_AI
EDIT-2 :但这可行
select ISNULL( CONVERT(VARCHAR(25), A.RESOLUTIONDATE, 112) , '-' )
FROM Jira.jiraissue A
原因可能是JOIN
?
答案 0 :(得分:4)
你做不到。 ISNULL函数本身用作查询结果列,或最终用作查询结果中的列的表达式。列中的所有字段/行必须具有相同的数据类型。所以你必须选择。
一种解决方案是将DATE转换为字符串,因此结果总是一个字符串,但我觉得最佳解决方案是为空日期返回NULL并让表示层决定是否或者不是NULL日期应显示为-
以及应显示非空日期的格式(客户端区域设置)。
对于表示层,我指的是显示或输出此数据的任何内容,可以是网页,CSV导出器,报告工具等等。
答案 1 :(得分:4)
您可以简单地将日期转换为varchar吗?既然你的输出可能不是一个有效的日期,这应该可以正常工作:
ISNULL(CONVERT(varchar(10), A.Date, 101),'-')
答案 2 :(得分:3)
如果您真的需要-
而不是null
,则需要将日期转换为字符串。
declare @T table(adate datetime)
insert into @T values(null)
insert into @T values(getdate())
select isnull(convert(varchar(23), adate, 126), '-')
from @T
答案 3 :(得分:1)
您可以尝试:
CASE WHEN A.DATE IS NULL
THEN '-'
ELSE CONVERT(VARCHAR(25), A.DATE, 112)
END
答案 4 :(得分:1)
我会使用CONVERT/CAST将DATE值从[DATE]TIME
转换为VARCHAR
:
SELECT ... ISNULL( CONVERT(VARCHAR(25), A.DATE, 112) , '-' ) AS DATE
FROM ...
可以使用另一种风格:103(dd / mm / yyyy),101(mm / dd / yyyy)或Date and Time Styles
section中的其他风格,而不是112风格(yyymmdd)。