2012-05-22 65 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