【问题标题】:SQL - pick current date from machine and compareSQL - 从机器中选择当前日期并进行比较
【发布时间】:2017-01-13 14:50:02
【问题描述】:

对于以下查询 场景 1:当年(上一周) - 例如 - 第 31 周

sum(case when s.Date between '2016-07-17' and '2016-07-23' then s.SELLINC else 0 end) ActualSales 

场景 2:去年(上一周) - 例如 - 第 31 周

sum(case when s.Date between '2015-07-19' and '2015-07-25' then s.SELLINC else 0 end) LastYrVarianc 

场景 3:从今年年初到今天的日期之间选择日期

sum(case when s.Date between '2016-01-01' and '2016-09-05' then s.SELLINC else 0 end) YrToDateActual 

场景 4:从去年年初到去年今天的日期之间选择日期

sum(case when s.Date between '2015-01-01' AND '2015-09-05' then s.SELLINC else 0 end) LastYrToDateActual

而不是硬编码日期。我想从机器中选择当前日期并进行比较。

一周从周日开始,到周六结束。请问有什么帮助吗?

【问题讨论】:

  • 使用 DATEFROMPARTS(YEAR(GETDATE()),12,31) 获取当前年份的年末

标签: sql sql-server tsql


【解决方案1】:

首先,GETDATE() 是今天日期的 SQL Server 函数

DATEADD(..) 是向日期添加内容的函数

1) case when s.date between DATEADD(dd,-6,getdate()) and getdate()) then...

2) case when s.date between DATEADD(yy,-1,DATEADD(dd,-6,getdate())) and DATEADD(yy,-1,getdate()) then ...

3) case when s.date between DATEADD(yy, DATEDIFF(yy,0,getdate()), 0) and getdate() then ...

4) case when s.date between dateadd(yy,-1,DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)) and DATEADD(yy,-1,GETDATE()) then ..

来自here的一点帮助

【讨论】:

    【解决方案2】:

    使用日期算术

    declare @weekNo int = 31; 
    --start of the year
    declare @ys datetime = dateadd(year,datediff(year,0,getdate()),0) 
    -- start of the first week of the year (may start in December of prev year)
    declare @y1ws datetime = dateadd(week,datediff(week,0,@ys),0) 
    
    select @ys, @y1ws, dateadd(week, @weekNo-1, @y1ws) [week31 start], dateadd(week, @weekNo, @y1ws) [week32 start]
    --    use it this way for week 31
    -- .. where somedate >= [week31 start] and somedate < [week32 start]
    

    【讨论】:

      【解决方案3】:

      我假设您的一周从星期日开始到星期六。

      你可以使用这个查询,

      场景 1(PreviousWeekStartDate 和 PreviousWeekEndDate)

      s.Date between convert(date,dateadd(wk, datediff(wk, 0, getdate()) - 1, 0) - 1) and convert(date,dateadd(wk, datediff(wk, 0, getdate()) - 1, 0) + 5)
      

      场景 2(LastYearPreviousWeekStartDate 和 LastYearPreviousWeekEndDate)

      s.Date between convert(date,dateadd(wk, datediff(wk, 0, dateadd(YEAR, - 1, getdate())) - 1, 0) - 1) and convert(date,dateadd(wk, datediff(wk, 0, dateadd(YEAR, - 1, getdate())) - 1, 0) + 5)
      

      场景 3(StartOfYear 和 CurrentDate)

      s.Date between convert(date,DATEADD(yy, DATEDIFF(yy, 0, getdate()), 0)) and convert(date,getdate())
      

      场景 4(StartOfLastYear 和 CurrentDateLastYear)

      s.Date between convert(date,DATEADD(yy, DATEDIFF(yy, 0, dateadd(YEAR, - 1, getdate())), 0)) and convert(date,dateadd(YEAR, - 1, getdate()))
      

      【讨论】:

        【解决方案4】:
        SELECT
            GETDATE(),                                          -- Today
            DATEADD(YEAR, DATEDIFF(YEAR, 0, GETDATE()), 0),     -- Start of this year
            DATEADD(YEAR, DATEDIFF(YEAR, 0, GETDATE()) - 1, 0), -- Start of last year
            DATEADD(WEEK, DATEDIFF(WEEK, 0, GETDATE()), 0),     -- Start of this week
            DATEADD(WEEK, DATEDIFF(WEEK, 0, GETDATE()) - 1, 0)  -- Start of last week
        

        【讨论】:

          【解决方案5】:

          我认为使用DATEPART (Transact-SQL) 是一种更便携的解决方案。我对场景 1 和场景 2 的回答指的是从周日开始的自然周,这与 JohnHC 的回答(指过去 7 天)不同。

          --
          -- Scenario 1: Current Year (Previous Week) - For eg- Week 31
          --
          CASE WHEN
              DATEPART(ww, s.Date) = DATEPART(ww, GETDATE()) - 1 AND
              DATEPART(yy, s.Date) = DATEPART(yy, GETDATE())
          THEN ...
          
          --
          -- Scenario 2: Last Year (Previous Week) - For eg- Week 31
          --
          CASE WHEN
              DATEPART(ww, s.Date) = DATEPART(ww, GETDATE()) - 1 AND
              DATEPART(yy, s.Date) = DATEPART(yy, GETDATE()) - 1
          THEN ...
          
          --
          -- Scenario 3: Picking dates between beginning of current year till today's date
          --
          CASE WHEN
              DATEPART(yy, s.Date) = DATEPART(yy, GETDATE())
          THEN ...
          
          --
          -- Scenario 4: Picking dates between beginning of last year till last year today's date
          --
          CASE WHEN
              DATEPART(yy, s.Date) >= DATEPART(yy, GETDATE()) - 1
          THEN ...
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-02-21
            • 2016-05-28
            • 1970-01-01
            • 1970-01-01
            • 2013-06-12
            • 1970-01-01
            • 2017-02-02
            • 1970-01-01
            相关资源
            最近更新 更多