2017-08-08 131 views
0

我对SQL很新,并且很难弄清楚如何使用if语句我试图根据今天的日期确定开始日期和结束日期。目前,我的标准设置是这样的:如果声明确定开始日期和结束日期

WHERE training.launch_date >= CONVERT(datetime, '2017-08-04') 
AND training.launch_date <= CONVERT(datetime, '2017-08-10') 

我需要做的是自动查询,所以我需要总是有START_DATE等于过去的周五,结束日期为即将到来的周四。我搞砸了一点,但似乎无法弄清楚正确的语法。这是我尝试过的,但当然不是。

WHERE training.launch_date >= (if(select datepart(dw,getdate()) = 6) 
     Select getdate() 
    ELSE (select getdate() - datepart(dw,getdate()))) 

AND training.launch_date <= (if(select datepart(dw,getdate()) = 6) 
     Select getdate() + 6 
    ELSE (select getdate() - datepart(dw,getdate())+6)) 

任何帮助,将不胜感激。

+2

MySQL的<> SQL服务器 –

+0

Case语句是你在找什么: https://docs.microsoft.com/en-us/sql/t-sql/language-elements/case-transact-sql – Leonidas199x

回答

0

不能使用像在查询IF流控制语句。您只能使用表达式,即CASE WHEN

在使用日期时,您必须记住“日期”可能包含时间分量,因此最好在第二天使用<,而不是在00:00:00时间内预计确切的日期。

您的查询可以写成:

SET DATEFIRST 5 

-- Remove hours, minutes etc. 
DECLARE @CurrentDay DATETIME = CONVERT(DATE, GETDATE()) 

SELECT * 
..... 
WHERE training.launch_date >= @CurrentDay + 1 - DATEPART(dw, @CurrentDay) 
    AND training.launch_date < @CurrentDay + 8 - DATEPART(dw, @CurrentDay) 

说明:

SET DATEFIRST - 设置一周的第一天。见MSDN

如果由于某种原因你不想使用SET DATEFIRST,这时你可以手动偏移的一周的开始:

DATEPART(dw, @CurrentDay + 2) 
+0

这样做。非常感谢! – adidashawn6

0

这里有一种方法......

declare @date datetime = '20170815' 

SELECT 
    case 
     when datepart(weekday, @date) >5 then 
     DATEADD(DAY, 4, DATEADD(WEEK, DATEDIFF(WEEK, 0, @date), 0)) 
     else DATEADD(DAY, -3, DATEADD(WEEK, DATEDIFF(WEEK, 0, @date), 0)) 
    end 
    ,DATEADD(DAY,(CASE DATEPART(DW,@date) 
        WHEN 5 THEN 7 
        WHEN 6 THEN 6 
        WHEN 7 THEN 5 
        ELSE 5 - DATEPART(DW,@date) END),@date) 

所以,在你的代码...

WHERE 
    training.launch_date >= case 
           when datepart(weekday, getdate()) >5 then 
           DATEADD(DAY, 4, DATEADD(WEEK, DATEDIFF(WEEK, 0, getdate()), 0)) 
           else DATEADD(DAY, -3, DATEADD(WEEK, DATEDIFF(WEEK, 0, getdate()), 0)) 
          end 
    AND training.launch_date <=DATEADD(DAY,(CASE DATEPART(DW,getdate()) 
              WHEN 5 THEN 7 
              WHEN 6 THEN 6 
              WHEN 7 THEN 5 
              ELSE 5 - DATEPART(DW,getdate()) END),getdate()) 
相关问题