【问题标题】:SQL Server : date automate TSQL QuerySQL Server:日期自动化 TSQL 查询
【发布时间】:2017-05-17 11:14:29
【问题描述】:

我希望 SQL 查询自动获取日期,

请注意:年份应始终从一月的最后一个星期日开始。

我想要以下示例的 SQL 查询;假设当前日期是 '2017-01-01'

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-01-01',SQL 查询返回这些日期:

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

哪些是错误的。

示例 2正确

假设当前日期为 '2017-02-12',则 SQL 查询返回这些日期:

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

这是正确的日期 - 好的。

问题总是在当前日期在一月份时

请问如何解决示例 1?任何更新的 SQL 查询?

【问题讨论】:

  • 您运行的是哪个版本的 SQL Server?如果至少在 2012 年,EOMONTH 函数可能会对您有用!
  • @bridge,SQL Server 2014
  • 您提到年份应该始终从 2 月 1 日开始,那么您将如何获得 '2016-01-31' 和 '2016-12-31' 之间的 '2017-01-01' ,我认为应该是'2016-02-07'和'2016-12-31'之间

标签: sql sql-server tsql date datetime


【解决方案1】:

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

    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

【讨论】:

  • 我不确定您是否真的想到了以下几点:在 '2016-12-31' 和 '2017-01-31' 之间
  • 谢谢。我不想手动输入当前日期。它想自己被采摘。
  • 用getdate()替换变量
  • 年开始日期 - 'XXXX-02-01' 和年结束日期 - 'XXXX-01-31'
  • 两个实例的 XXXX 是同一年?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-29
  • 2015-11-19
  • 1970-01-01
  • 1970-01-01
  • 2019-12-06
  • 2018-02-14
相关资源
最近更新 更多