的SQL Server:日期自动TSQL查询

问题描述:

我想SQL查询来自动获取的日期,的SQL Server:日期自动TSQL查询

请注意:今年应该总是开始一月最后一个星期日。

我想要一个SQL查询下面的例子;假定当前日期是“2017年1月1日”

SQL应该选择这些日期:

Between '2016-01-31' and '2016-12-31' 

(间“年度开始(去年一月月的星期日)”和“最后一天(周六)此前一周的)

的我有这个疑问:

Between 
    case 
     When DatePart(w, DateAdd(d, 30, DATEADD(y, - DatePart(y, GetDate()) + 1, GetDate()))) = 1 
      Then DateAdd(d, 30, DATEADD(y, - DatePart(y, GetDate()) + 1, convert(date, GetDate()))) 
      Else DateAdd(d, 7 - DatePart(w, DateAdd(d, 30, DATEADD(y, - DatePart(y, GetDate()) + 1, GetDate()))) + 1, DateAdd(d, 30, DATEADD(y, - DatePart(y, GetDate()) + 1, convert(date, GetDate()))) 
       ) 
     end 
and 
    convert(date, dateadd(wk, datediff(wk, 0, getdate()) - 1, 0) + 5) 

上面的查询将返回错误的结果:

实施例1错误

假定当前日期是 '2017年1月1日',SQL查询返回这些日期:

Between '2017-02-05' and '2016-12-31' 

这是错误的。

例2正确

假定当前日期是 '2017年2月12日',那么SQL查询返回这些日期:

Between '2017-02-05' and '2017-02-11' 

这是正确的日期 - 确定。

问题始终是在当前日期是在一月

如何修复例如1,请?任何更新的SQL查询?

+0

哪个版本的SQL服务器正在运行?如果至少在2012年,[EOMONTH](https://msdn.microsoft.com/en-us/library/hh213020.aspx)函数可能对您有用! – Bridge

+0

@bridge,SQL Server 2014 – user2331670

+0

您提到的年份应该始终在2月1日开始,那么您将如何在'2017-01-01'之间获得'2016-01-31'和'2016-12-31'之间' ,我认为应该是'2016年2月7日'和'2016年12月31日' –

如果任何一年的二月是那么你的固定参数,你当前的日期进行比较,并根据其结果使用与否:

DECLARE @GetMyDate datetime = '2017-01-01'--GETDATE() 

    SELECT @GetMyDate, 
      CASE 
       WHEN @GetMyDate < DATEADD(Day,-1,CONVERT(datetime, CONVERT(varchar(4), (year(@GetMyDate))) + '-02-01')) 
       THEN DATEADD(Day,-1,CONVERT(datetime, CONVERT(varchar(4), (year(@GetMyDate)-1)) + '-02-01')) 
       ELSE DateAdd(d, 7 - DatePart(w, DateAdd(d, 30, DATEADD(y, - DatePart(y, @GetMyDate) + 1, @GetMyDate))) + 1, DateAdd(d, 30, DATEADD(y, - DatePart(y, @GetMyDate) + 1, convert(date, @GetMyDate)))) 
      END AS StartDate, 
      convert(date, dateadd(wk, datediff(wk, 0, @GetMyDate) - 1, 0) + 5) AS EndDate 

更新:

BETWEEN CASE 
      WHEN GETDATE() <= DATEADD(Day,-0,CONVERT(datetime, CONVERT(varchar(4), (year(GETDATE()))) + '-02-01')) 
      THEN DATEADD(Day,-0,CONVERT(datetime, CONVERT(varchar(4), (year(GETDATE())-1)) + '-02-01')) 
      ELSE DateAdd(d, 7 - DatePart(w, DateAdd(d, 30, DATEADD(y, - DatePart(y, GETDATE()) + 1, GETDATE()))) + 1, DateAdd(d, 30, DATEADD(y, - DatePart(y, GETDATE()) + 1, convert(date, GETDATE())))) 
     END 
     AND 
     CASE 
      WHEN GETDATE() = DATEADD(Day,-0,CONVERT(datetime, CONVERT(varchar(4), (year(GETDATE()))) + '-02-01')) 
      THEN DATEADD(Day,-1,CONVERT(datetime, CONVERT(varchar(4), (year(GETDATE()))) + '-02-01')) 
      ELSE Convert(date, dateadd(wk, datediff(wk, 0, GETDATE()) - 1, 0) + 5) 
     END 
+0

之间'我不确定你是否真的有以下几点:'2016-12-31'和'2017-01之间-31' –

+0

谢谢。我不想手动输入当前日期。它想要自己挑选。 – user2331670

+0

将变量替换为getdate() –