【问题标题】:sql query to return date range or all records or only null recordssql查询返回日期范围或所有记录或仅空记录
【发布时间】:2012-06-04 16:24:45
【问题描述】:

我有一个无法正常工作的 sql 查询

这是查询的简化版本。

select * from Permit 
inner join BMP on Permit.PermitNumber = BMP.PermitNumber
left join BMPInspection as BI on Permit.PermitNumber = BI.PermitNumber and BMP.BMPNumber = BI.BMPNumber

where Permit.PermitNumber = 'S002552' 
AND ( ( @StartDate IS NULL
             AND @EndDate IS NULL )
            OR ( BI.dtActionDate > Dateadd(day, -1, @StartDate)
                 AND BI.dtActionDate < Dateadd(day, 1, @EndDate) )
            OR ( BI.dtActionDate > Dateadd(day, -1, @StartDate)
                 AND @EndDate IS NULL )
            OR ( @StartDate IS NULL
                 AND BI.dtActionDate < Dateadd(day, 1, @EndDate) ) )

期望的行为是

  1. 仅返回指定开始日期和结束日期的日期范围内的记录
  2. 当开始日期为 NULL 且结束日期有日期时,返回 NULL 日期或小于结束日期
  3. 当开始日期有日期且结束日期为空时,返回 NULL 或大于开始日期
  4. 当开始日期和结束日期都为 NULL 时,只返回日期为 NULL 的记录

现在我能得到的只是日期范围或所有记录 NULLS 和有效日期。

【问题讨论】:

    标签: sql-server date-range


    【解决方案1】:

    对于这种情况:

    当开始日期和结束日期都返回时,仅返回具有 NULL 日期的记录 为空

    变化:

    ( @StartDate IS NULL AND @EndDate IS NULL )
    

    ( @StartDate IS NULL AND @EndDate IS NULL AND BI.dtActionDate IS NULL)
    

    【讨论】:

    • 呃,我已经盯着这个看了四个多小时了。非常感谢。
    • 并通过扩展将codeOR BI.dtActionDate is NULL 添加到其他短语将满足其他条件
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-02
    • 2021-01-29
    相关资源
    最近更新 更多