如何避免存在具有给定日期的记录的空日期记录,否则需要获取具有空日期的记录

时间:2016-05-21 06:16:47

标签: mysql sql sql-server

我有一张表,其中对于相同的AgencyMaster ID,我有多个条目具有不同的effectiveStart日期和effectiveEnd日期,以及一个条目,其中effectiveEnd和effectiveStart都为null。

如果我给的日期没有条目那么它应该返回记录,其中effectiveEnd和effectiveStart为null,否则对应的记录具有该特定的effectiveStart和effectiveEnd日期,但是我的问题是它的返回记录为null date并记录特定日期,总共2条记录,以便如何避免这种情况。

select AgencyBillingSettingsMaster.AgencyBillingSettingMasterID, *
from AgencyBillingSettingsMaster
where (AgencyBillingSettingsMaster.effectivePeriodStart is not null and 
       AgencyBillingSettingsMaster.effectivePeriodEnd is not null and 
       (convert(datetime,@EffectivePeriod)>=effectivePeriodStart and
        convert(datetime,@EffectivePeriod)<effectivePeriodEnd)
        or (AgencyBillingSettingsMaster.effectivePeriodStart is null and
            AgencyBillingSettingsMaster.effectivePeriodEnd is null))

附表屏幕截图

enter image description here

2 个答案:

答案 0 :(得分:1)

希望你放错了右括号。每个条件应该是分开的,但在您当前的代码中,所有条件都是单一条件。

代码将解决您的问题:

select AgencyBillingSettingsMaster.AgencyBillingSettingMasterID, *
from AgencyBillingSettingsMaster
where (AgencyBillingSettingsMaster.effectivePeriodStart is not null and 
       AgencyBillingSettingsMaster.effectivePeriodEnd is not null and 
       (convert(datetime,@EffectivePeriod)>=effectivePeriodStart and 
        convert(datetime,@EffectivePeriod)<effectivePeriodEnd)) -- here the first condition need to close
        or -- the second condition should have another block
          (AgencyBillingSettingsMaster.effectivePeriodStart is null and
           AgencyBillingSettingsMaster.effectivePeriodEnd is null)

答案 1 :(得分:0)

在MySQL中可以将函数FOUND_ROWS()UNION结合使用以获得条件联合:

SELECT .... FROM ... WHERE your_condition_for_existing_dates_here
UNION ALL
SELECT .... FROM ... WHERE FOUND_ROWS() = 0 AND your_condition_for_null_dates_here

您的查询将如下:

select AgencyBillingSettingsMaster.AgencyBillingSettingMasterID, *
from AgencyBillingSettingsMaster
where (AgencyBillingSettingsMaster.effectivePeriodStart is not null and 
       AgencyBillingSettingsMaster.effectivePeriodEnd is not null and 
       (convert(datetime,@EffectivePeriod)>=effectivePeriodStart and
        convert(datetime,@EffectivePeriod)<effectivePeriodEnd)
union all
select AgencyBillingSettingsMaster.AgencyBillingSettingMasterID, *
from AgencyBillingSettingsMaster
where found_rows() = 0 
        and (AgencyBillingSettingsMaster.effectivePeriodStart is null and
            AgencyBillingSettingsMaster.effectivePeriodEnd is null))
相关问题