2016-05-21 40 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)