在带有日期的IF语句中查看是否存在NULL

时间:2014-01-29 15:33:16

标签: sql sql-server

我有这个查询,我看看AUD_CloseDate是否>比今天的日期。现在我想象这些在AUD_CloseDate中的某个地方是NULL,所以在这个语句中我还要检查AUD_CloseDate中是否有NULL值以及是否有赋值1900\01\01

SELECT ([Target Status] + '' + CAST(COUNT(*) AS NVARCHAR(255))  + ' of ' + CAST(@Total AS NVARCHAR(255))) AS TargetStatus, CAST(COUNT(*) AS FLOAT)/CAST(@Total AS FLOAT) AS [Count]
        FROM (
        SELECT CASE WHEN CONVERT(DATETIME,CONVERT(CHAR(10),DATEADD(DAY,0,t2.AUD_CloseDate), 101)) < CONVERT(DATETIME,CONVERT(CHAR(10),DATEADD(DAY,0,GETDATE()), 101))AND t1.[Status] in ('Open','Closed')
                THEN 'Over Due: '
                ELSE 'On Time: ' END AS [Target Status]
                FROM #tmp1 t1 INNER JOIN dbo.Audit t2
                ON t1.AUD_ID = t2.AUD_ID
                WHERE t2.AUD_Deleted = 0
                AND t2.AUD_LeadAuditor IN (SELECT ID FROM [dbo].[fx_SplitCommaSeperatedValues] (@LeadAssessor))
                AND t2.AUD_Year = @Year
                AND AUD_Quarter IN (SELECT ID FROM [dbo].[fx_SplitCommaSeperatedValues] (@Quarter)))DER

3 个答案:

答案 0 :(得分:0)

使用ISNULL功能

ISNULL(AUD_CloseDate, '1900-01-01')

你也是:
添加0天到目前为止 把它铸成char(10)
,然后再次铸造到目前为止......为什么?

您可以通过这些转换获得相同的结果,例如:

SELECT
CASE
    WHEN ISNULL(@a, '2014-01-29 13:50') < GETDATE()
    THEN 'Over Due: '
    ELSE 'On Time: '
END

结果'逾期:'

SELECT
CASE
    WHEN ISNULL(@a, '2014-01-29 15:00') < GETDATE()
    THEN 'Over Due: '
    ELSE 'On Time: '
END

结果'准时:'

**现在是13:55:)

答案 1 :(得分:0)

为什么选择ISNULL() statement

ISNULL(t2.AUD_CloseDate,'19000101')

在你的例子中:

SELECT ([Target Status] + '' + CAST(COUNT(*) AS NVARCHAR(255))  + ' of ' + CAST(@Total AS NVARCHAR(255))) AS TargetStatus, CAST(COUNT(*) AS FLOAT)/CAST(@Total AS FLOAT) AS [Count]
        FROM (
        SELECT CASE WHEN CONVERT(DATETIME,CONVERT(CHAR(10),DATEADD(DAY,0,ISNULL(t2.AUD_CloseDate,'19000101')), 101)) < CONVERT(DATETIME,CONVERT(CHAR(10),DATEADD(DAY,0,GETDATE()), 101))AND t1.[Status] in ('Open','Closed')
                THEN 'Over Due: '
                ELSE 'On Time: ' END AS [Target Status]
                FROM #tmp1 t1 INNER JOIN dbo.Audit t2
                ON t1.AUD_ID = t2.AUD_ID
                WHERE t2.AUD_Deleted = 0
                AND t2.AUD_LeadAuditor IN (SELECT ID FROM [dbo].[fx_SplitCommaSeperatedValues] (@LeadAssessor))
                AND t2.AUD_Year = @Year
                AND AUD_Quarter IN (SELECT ID FROM [dbo].[fx_SplitCommaSeperatedValues] (@Quarter)))DER

答案 2 :(得分:0)

COALESCE符合ANSI标准。与ISNULL语法相同:COALESCE(t2.AUD_CloseDate,'19000101')