如果声明确定开始和结束日期

时间:2017-08-08 14:03:59

标签: sql-server

我对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 个答案:

答案 0 :(得分: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())

答案 1 :(得分:0)

您不能在查询中使用selenium.common.exceptions.WebDriverException: Message: Unexpected error launching Internet Explorer. IELaunchURL() returned HRESULT 800700C1 ('%1 is not a valid Win32 application.') for URL 'http://localhost:58689/' 等流控制语句。您只能使用IF等表达式。

在处理日期时,您必须记住&#34;日期&#34;可以包括时间分量,因此最好使用&lt;第二天,而不是期待00:00:00的确切日期。

您的查询可以写成:

CASE WHEN

说明:

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 ) - 设置一周的第一天。见MSDN

如果由于某种原因你不想使用SET DATEFIRST,那么你可以手动抵消一周的开始:

SET DATEFIRST