【问题标题】:Track the week intervals from the month start date跟踪从月份开始日期起的周间隔
【发布时间】:2022-01-27 09:08:47
【问题描述】:

我试图找出从 2021 年 1 月 1 日开始,每 1 周有多少跑步者报名参加。我的查询没有问题,但我无法使用日期达到 7 天数字标记的 mod (%) 来完成我的查询。

---My Schema
CREATE TABLE runners (
  "runner_id" INTEGER,
  "registration_date" DATE
);
INSERT INTO runners
  ("runner_id", "registration_date")
VALUES
  (1, '2021-01-01'),
  (2, '2021-01-03'),
  (3, '2021-01-08'),
  (4, '2021-01-15');


runner_id   registration_date
1   2021-01-01
2   2021-01-03
3   2021-01-08
4   2021-01-15

所需的 O/P:

start_of_week   signups
2021-01-01    2
2021-01-08    1
2021-01-15    1
---My Query

WITH data1 AS (
  SELECT
    runner_id,
    registration_date,
    REGISTRATION_DATE - (DATEDIFF(DAY, REGISTRATION_DATE, '2021-01-01' ) % 7)  AS start_of_week
  FROM runners
)
select start_of_week, count(runner_id) as signup from data1 group by start_of_week;

错误

操作数类型冲突:日期与 int 不兼容

我也尝试将日期格式切换为带有 7 的 mod,但没有奏效。

 registration_date - ((registration_date - '2021-01-01') % 7)

错误

数据类型 date 和 varchar 在减法运算符中不兼容。

【问题讨论】:

  • 在日期上使用模数 (%) 没有意义,它不是数字。您实际上想在这里实现什么?
  • 听起来您只需要按周数计数和分组吗?
  • @Larnu 我想知道每 1 周有多少跑步者报名参加? (即周从 2021-01-01 开始)
  • 我认为你不需要取模,你需要除以7并加1才能得到周数。另外你不需要从registration_date中减去它,它是日期,周数是一个整数,因此错误

标签: sql sql-server tsql datetime


【解决方案1】:

根据 cmets,试试这个:

 WITH data1 AS (
  SELECT
    runner_id,
    registration_date,
    (datediff(DAY,  '2021-01-01',REGISTRATION_DATE ) / 7) + 1 AS start_of_week
  FROM runners
)
select
  dateadd(week, start_of_week - 1, '2021-01-01'),
  count(runner_id) as signup
from data1
group by start_of_week;

dbfiddle

https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=91a00cf6223f3c1367b6e8f014dccd6f

如果您想摆脱时间,也可以将其转换为日期

select
  cast(dateadd(week, start_of_week - 1, '2021-01-01') as date),
  count(runner_id) as signup
from data1
group by start_of_week;

【讨论】:

  • 这个给我 -1,0,1 因为 start_of_week 是我想要的日期和他们在描述中的注册。
  • @Mitt 我不这么认为,请检查小提琴,确保日期差异中的开始日期是第一个,注册日期是第二个
  • 我正在寻找的是 '2021-01-01 - 1..ie (registration_date | no_of_sign_ups)。
  • @Mitt 不客气!我会说这是在 SQL 中多次使用日期的经验;并不总是直截了当,这些“技巧”会派上用场。
  • 谢谢老兄!!祝您和您所爱的人 2022 年快乐 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-29
  • 1970-01-01
相关资源
最近更新 更多