2012-05-22 99 views
0

我創建將每月兩次運行查詢:基於Sysdate有條件的條款?

  1. 在本月5日的前一個月的月的16,最後一天在看賬單天。

    datepart(dd,h.BILLED_DATE) > 15  
    DATEPART(mm, h.billed_date) = DATEPART(mm,dateadd(m,-1,getdate())) 
    and DATEPART(yyyy, h.billed_date) = DATEPART(yyyy,dateadd(m,-1,getdate())) 
    
  2. 查看當月1月20日查看當月1月15日的結算日期。

    datepart(dd,h.BILLED_DATE) >= 1 
    and datepart(dd,h.BILLED_DATE) < 16 
    and DATEPART(mm, h.BILLED_DATE) = DATEPART(mm,GETDATE()) 
    and DATEPART(yyyy, h.BILLED_DATE) = DATEPART(yyyy,GETDATE())) 
    

在where子句中這些獨立工作。然而,當我試圖將它們結合在where子句中的case語句中時,我收到了錯誤,從「then」之後的第一個不等式開始。

Where 
    Case 
    when datepart(dd,getdate()) > 15 
     then [2 above] 
     else [1 above] 
    End 

治癒我的無知。

+0

無,我搞砸了切割和粘貼。它是固定的。抱歉。 –

回答

3

CASE是一個返回單個值的表達式。您不能像使用其他語言一樣使用它來控制流量。

您的查詢也不會對您的billed_date列使用任何索引,您應該考慮添加這些索引以支持此查詢。

這個怎麼樣重新編寫,它採用純日期時間的操作,以建立一個開放式的範圍,而不是執行所有這些昂貴的日期部分功能:

DECLARE @today SMALLDATETIME, @start SMALLDATETIME, @end SMALLDATETIME; 
SET @today = DATEADD(DAY, 0, DATEDIFF(DAY, 0, CURRENT_TIMESTAMP)); 

SET @start = DATEADD(DAY, 1-DAY(@today), @today); 
SET @end = DATEADD(DAY, 15, @start); 

IF DATEPART(DAY, @today) <= 15 
BEGIN 
    SET @start = DATEADD(MONTH, -1, @end); 
    SET @end = DATEADD(DAY, 1-DAY(@today), @today); 
END 

SELECT ... WHERE h.billed_date >= @start AND h.billed_date < @end; 
+0

你在說什麼重寫? – Crisfole

+0

@ChristopherPfohl請給我一分鐘。對不起,編輯器失去了所有的格式/工具欄等。必須註銷並返回。 –

+0

呃,討厭! – Crisfole

0

這應該這樣做

WHERE (
    datepart(dd,getdate()) > 15 
    AND DATEPART(mm, enc.hosp_admsn_time) = DATEPART(mm,dateadd(m,-1,getdate())) 
    AND DATEPART(yyyy, enc.hosp_admsn_time) = DATEPART(yyyy,dateadd(m,-1,getdate())) 
) OR (
    datepart(dd,h.BILLED_DATE) >= 1 
    and datepart(dd,h.BILLED_DATE) < 16 
    and DATEPART(mm, h.BILLED_DATE) = DATEPART(mm,GETDATE()) 
    and DATEPART(yyyy, h.BILLED_DATE) = DATEPART(yyyy,GETDATE())) 
) 
+0

我不是在尋找任何時期的交易。這將被設置爲運行並自動發送。如果是在本月5日運行,那麼它需要查找上個月的16日的最後一天。如果它在本月20日運行,則需要查找同一月的1月15日。 –

+0

無論當前日期如何,此查詢都將包含本月前15天的行。如果今天的日期在15日以後,它還將包括上個月的所有行。這些選項都不像是OP之後的東西。 –

+0

你們是對的。沒有足夠深入的閱讀,我做出了過於機械的改變。採取點,經驗教訓。 – bluevector