【问题标题】:SQL Server - Write a query that groups weeks data from Fri->ThursSQL Server - 编写一个查询,将周五->周四的周数据分组
【发布时间】:2019-02-24 23:09:03
【问题描述】:

我正在尝试通过以下方式将我的数据库中的数据与 Thurs->Fri 分开:

(Get last 10 weeks of data, grouped by Fri->Thurs as a week) e.g if today was 8/13/2018:

From (Fri)  To (Thur)
---------------------
8/10/2018   8/16/2018
8/3/2018    8/9/2018
7/27/2018   8/2/2018
7/20/2018   7/26/2018
7/13/2018   7/19/2018
7/6/2018    7/12/2018
6/29/2018   7/5/2018
6/22/2018   6/28/2018
6/15/2018   6/21/2018
6/8/2018    6/14/2018

我尝试通过编写查询来做到这一点(比我喜欢的要复杂):

WITH Vars (d)
AS (
  SELECT DATEADD(week,-9, (DATEADD(day, - ((Datepart(WEEKDAY,GETDATE()) +1) %  7) , GETDATE()))  ) As 'd' 
)
SELECT WeekNum+1  As [WeekNum], Count(*) Count
FROM
(
 SELECT (Datepart(Week, (DATEADD(day, - ((Datepart(WEEKDAY,t.DateField)+1 ) %  7), t.DateField)) ) )as WeekNum
 FROM Table as t
 WHERE (SELECT d FROM Vars) <= t.DateField

) as table

GROUP BY WeekNum
ORDER BY WeekNum ASC

但是它分组的日期是错误的

如何修改查询以返回正确的数据?

注意如果可能的话,我希望这是一个查询而不是任何类型的存储过程。

【问题讨论】:

  • 你有日历表吗?如果是这样,它很可能会让事情变得更容易。
  • @Larnu Il 实际上对此进行了调查。它会让事情变得更容易,特别是考虑到我必须在一个事务(查询)中写这个

标签: sql-server sql-server-2005 sql-date-functions


【解决方案1】:

您查询中的问题是DATEPART(WEEKDAY,...。返回的工作日取决于您的区域设置,并且很可能使用星期日作为一周的开始。

要计算最近的星期五,您可以使用这样的表达式(不依赖于区域设置):

DATEADD(week, DATEDIFF(day, 4, GETDATE())/7, 4)

这利用了 SQL Server 的“日期 0”是 1/1/1900(星期一)这一事实,因此“日期 4”是 1900 年 1 月 5 日(星期五),并且还利用了返回的 DATEDIFF一个整数,所以除以 7 是一个 整数除法

假设您的 WeekNum 工作正常,尤其是在一年之后,查询可以这样更改:

SELECT DATEPART(week, Friday)+1 AS WeekNum, COUNT(*) AS [Count]
FROM
(
  SELECT DATEADD(week, DATEDIFF(day, 4, t.DateField)/7, 4) AS Friday
  FROM [Table] t
  WHERE t.DateField >= DATEADD(week, DATEDIFF(day, 4, GETDATE())/7-9, 4)
) AS [table]
GROUP BY Friday
ORDER BY Friday

此外,您可以根据需要轻松显示日期:

SELECT Friday, DATEADD(day, 6, Friday) AS Thursday, COUNT(*) AS [Count]
FROM ... -- same as above

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-06
    相关资源
    最近更新 更多