2016-05-21 44 views
1

我有一张表,其中对于相同的AgencyMaster ID,我有多个条目,其中有效开始日期和有效结束日期不同, effectiveEnd和effectiveStart为null。如何避免无效日期记录,其中有给定日期的记录,否则需要获得无效日期的记录

如果我给没有条目的日期,那么它应该返回记录与effectiveEnd和effectiveStart作为空else相应的记录与该特定effectiveStart和effectiveEnd日期,但在这里我的问题是,它是返回记录与null日期和记录与特定的日期,共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

+0

为什么你将有一个空的开始日期? – Strawberry

回答

0

有可能在MySQL中结合UNION使用功能FOUND_ROWS()为了得到一个有条件的工会:

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)) 
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)