Home > other >  Using modulo operator with Date
Using modulo operator with Date

Time:12-29

I'm trying to find how many runners signed up for each 1 week period starting from 2021-01-01. I've got no problem with the query but i'm unable to do a mod (%) with the date to reach a 7 day figure mark to round up my query.

---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

Desired 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;

Error

Operand type clash: date is incompatible with int

I also tried switching the date formats to mod with 7 but didn't work.

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

Error

The data types date and varchar are incompatible in the subtract operator.

CodePudding user response:

as per comments, try this:

 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

you can also cast it as date if you want to get rid of the time

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;
  • Related