Как найти последние 4 недели того же значения дня недели, начиная с сегодняшнего дня - PullRequest
1 голос
/ 11 июля 2019

Я пытаюсь выбрать записи за сегодня и в тот же день каждой недели за последние 4 недели.

  1. Сегодня (вторник)
  2. Последний вторник
  3. Вторник до этого
  4. Вторник до этого

Мне нужно, чтобы это было привязано к текущей дате, потому что я собираюсь выполнять этот запрос каждый день, поэтому я не хочу использовать интервал или что-то, где я вручную указываю диапазон дат.

Все, что я нашел илидо сих пор пытался получить данные за последний месяц, но не за последние 4 недели того же дня недели.

select *
from table
where thedatecolumn >= DATEADD(mm, -1, GETDATE())

Это работает, но тянет все с прошлого месяца.

Если сегодняшняя дата7/10/2019 Мне нужно

Data from 7/10/2019
Data from 7/3/2019
Data from 6/26/2019
Data from 6/19/2019

Каждый день я буду запускать этот запрос, поэтому мне нужно, чтобы он был динамическим на основе текущей даты.

Ответы [ 3 ]

0 голосов
/ 11 июля 2019

Я полагаю, что вы хотите просмотреть 21 день, а затем отфильтровать те даты, которые имеют тот же день недели:

select * from table
where thedatecolumn >= DATEADD(DAY, -21, CAST(GETDATE() AS DATE))
    and DATEPART(WEEKDAY, thedatecolumn) = DATEPART(WEEKDAY, GETDATE())
0 голосов
/ 11 июля 2019

Это довольно просто. Замените CURRENT_TIMESTAMP здесь на любую данную дату.

SELECT CONVERT(DATE,CURRENT_TIMESTAMP) AS Today, 
DATEADD(DAY,-7,CONVERT(DATE,CURRENT_TIMESTAMP)) AS LastWeek ,
DATEADD(DAY,-14,CONVERT(DATE,CURRENT_TIMESTAMP)) AS TwoWeeksAgo, 
DATEADD(DAY,-21,CONVERT(DATE,CURRENT_TIMESTAMP)) AS ThreeWeeksAgo

ТАК, если вы хотите получить данные для набора диапазонов за один целый день с этими датами:

SELECT something
WHERE
datetimecolumn >= CONVERT(DATE,CURRENT_TIMESTAMP) AND datetimecolumn < DATEADD(DAY,1, CONVERT(DATE,CURRENT_TIMESTAMP)) -- Todays range, 
OR datetimecolumn >= DATEADD(DAY,-7,CONVERT(DATE,CURRENT_TIMESTAMP)) AND datetimecolumn < DATEADD(DAY,1,DATEADD(DAY,-7,CONVERT(DATE,CURRENT_TIMESTAMP)))-- LastWeek ,
OR datetimecolumn >= DATEADD(DAY,-14,CONVERT(DATE,CURRENT_TIMESTAMP)) AND datetimecolumn < DATEADD(DAY,1,DATEADD(DAY,-14,CONVERT(DATE,CURRENT_TIMESTAMP)))-- TwoWeeksAgo, 
OR datetimecolumn >= DATEADD(DAY,-21,CONVERT(DATE,CURRENT_TIMESTAMP)) AND datetimecolumn < DATEADD(DAY,1, DATEADD(DAY,-21,CONVERT(DATE,CURRENT_TIMESTAMP))) -- ThreeWeeksAgo
0 голосов
/ 11 июля 2019

Вы можете попробовать использовать рекурсивный cte, который начинается сегодня и многократно вычитает 7 дней - так что вы всегда будете приземляться в один и тот же день недели. Следующий пример:

WITH cteFromToday AS(
 SELECT 0 AS WeeksBack, GETDATE() AS MyDate
 UNION ALL
 SELECT WeeksBack + 1 AS WeeksBack, DATEADD(d, -7, MyDate) AS MyDate
   FROM cteFromToday
)
SELECT TOP 5 *
  FROM cteFromToday
  OPTION ( MaxRecursion 0 );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...