【问题标题】:how to get data of current week only in SQL server?如何仅在 SQL Server 中获取本周的数据?
【发布时间】:2014-04-14 02:49:54
【问题描述】:

我想要只在本周插入记录时存储当前日期的表中的记录。

我试过了:

SELECT PId 
,WorkDate 
,Hours          
,EmpId            
FROM Acb       
WHERE EmpId=@EmpId AND WorkDate BETWEEN DATEADD(DAY, -7, GETDATE()) AND GETDATE()

【问题讨论】:

  • 您的查询出了什么问题?
  • 显示从今天到最近7天的记录。@shree.pat18
  • 定义“当前周”。它是从周日还是周一开始?
  • 尝试改为-6。
  • 本周从星期一开始@Greenstone walker

标签: sql-server sql-server-2008 date


【解决方案1】:

这样做:

SET DATEFIRST 1 -- Define beginning of week as Monday
SELECT [...]
AND WorkDate >= dateadd(day, 1-datepart(dw, getdate()), CONVERT(date,getdate())) 
AND WorkDate <  dateadd(day, 8-datepart(dw, getdate()), CONVERT(date,getdate()))

解释:

  • datepart(dw, getdate()) 将返回当前星期的天数,从 1 到 7,从您使用 SET DATEFIRST 指定的任何内容开始。
  • dateadd(day, 1-datepart(dw, getdate()), getdate()) 减去到达本周开始所需的天数
  • CONVERT(date,getdate()) 用于删除 GETDATE() 的时间部分,因为您希望数据从午夜开始。

【讨论】:

  • 非常感谢您的回答。它运行良好。再次感谢。@Twinkles
  • 如果我想使用自己的日期对象而不是预定义的 getdate(),该怎么办?
  • 非常感谢。需要注意的是,SET DATEFIRST 1 在存储过程调用后恢复到其原始状态。
【解决方案2】:

更好的方法是

select datepart(ww, getdate()) as CurrentWeek

您也可以使用 wk 代替 ww。

Datepart Documentation

【讨论】:

  • 我知道这是旧的(刚刚通过 Google 找到),但这不会也返回日期在同一周但来自不同年份的记录吗?
  • 重复答案 - 2014 年 4 月 14 日 12:53 Amul Harad 回答
  • @AquaAlex 他们不是重复的。
  • 请记住一年中的第一周,例如 2019-12-31 和 2020-01-01 在同一周,但 datepart(ww, getdate()) 将返回 53 和 1
【解决方案3】:

它对我有用。

Select * From Acb Where WorkDate BETWEEN DATEADD(DAY, -7, GETDATE()) AND DATEADD(DAY, 1, GETDATE())

你必须把这行放在AND子句AND DATEADD(DAY, 1, GETDATE())之后

【讨论】:

  • 您检索到的数据不是本周的,而是一周前的数据。
【解决方案4】:

datepart(dw, getdate()) 是星期几,dateadd(day, 1-datepart(dw, getdate()), getdate()) 应该是星期的第一天,加上 7 得到星期的最后一天

【讨论】:

    【解决方案5】:

    您可以使用以下查询来提取当前周:

    select datepart(dw, getdate()) as CurrentWeek
    

    【讨论】:

    • 这不是返回星期几,而不是一年中的当前星期吗?
    【解决方案6】:
    SET DATEFIRST 1;
        ;With CTE
        AS
        (
        SELECT
        FORMAT(CreatedDate, 'MMMM-yyyy') as Months,
        CASE 
        WHEN YEAR(DATEADD(DAY, 1-DATEPART(WEEKDAY, Min(CreatedDate)), Min(CreatedDate))) < YEAR(Min(CreatedDate))
        THEN FORMAT(DATEADD(YEAR, DATEDIFF(YEAR, 0,DATEADD(YEAR, 0 ,GETDATE())), 0) ,'MMM dd')   + ' - ' + FORMAT(DATEADD(dd, 7-(DATEPART(dw, Min(CreatedDate))), Min(CreatedDate))  ,'MMM dd')
        ELSE
        FORMAT(DATEADD(DAY, 1-DATEPART(WEEKDAY, Min(CreatedDate)), Min(CreatedDate)) ,'MMM dd') + ' - ' + FORMAT(DATEADD(dd, 7-(DATEPART(dw, Min(CreatedDate))), Min(CreatedDate)) ,'MMM dd') 
        END  DateRange,
        Sum(ISNULL(Total,0)) AS Total,
        sum(cast(Duration as int)) as   Duration    
        FROM TL_VriandOPI_Vendorbilling where VendorId=@userID and CompanyId=@CompanyID
        Group By DATEPART(wk, CreatedDate) ,FORMAT(CreatedDate, 'MMMM-yyyy')
        )
        SELECT Months,DateRange,Total,Duration,
        case when DateRange=(select FORMAT(DATEADD(DAY, 1-DATEPART(WEEKDAY, Min(getdate())), Min(getdate())) ,'MMM dd') + ' - ' +
        FORMAT(DATEADD(dd, 7-(DATEPART(dw, Min(getdate()))), Min(getdate())) ,'MMM dd'))
        then 1 else 0 end as Thisweek
        FROM CTE order by Months desc
    

    【讨论】:

      【解决方案7】:

      使用DATEDIFF 也可以,但是有点hacky,因为它不关心datefirst

      set datefirst 1; -- set monday as first day of week
      declare @Now datetime = '2020-09-28 11:00';
      
      
      select * 
      into #Temp
      from
      (select 1 as Nbr, '2020-09-22 10:00' as Created
      union
      select 2 as Nbr, '2020-09-25 10:00' as Created
      union
      select 2 as Nbr, '2020-09-28 10:00' as Created) t
      
      
      select * from #Temp where DATEDIFF(ww, dateadd(dd, -@@datefirst, Created), dateadd(dd, -@@datefirst, @Now)) = 0 -- returns 1 result
      select * from #Temp where DATEDIFF(ww, dateadd(dd, -@@datefirst, Created), dateadd(dd, -@@datefirst, @Now)) = 1 -- returns 2 results
      
      
      drop table #Temp
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-29
        • 2011-06-20
        • 2011-01-20
        • 1970-01-01
        • 2019-07-04
        相关资源
        最近更新 更多