Как искать и группировать по столбцу даты в наборы диапазонов продолжительности? - PullRequest
1 голос
/ 08 августа 2011

У меня есть таблица, подобная этой;

jobID - jobTitle - jobCreatedDate

Я хочу, чтобы посетители могли искать в таблице Джобсов и перечислять ее, группируя вот так, и я хочу сделатьэто только с одним запросом SQL:

Date Added
- AnyTime (20)
- 1 day ago (5)
- 2-7 days ago (2)
- 8-14 days ago (0)
- 15-30 days ago (7)

Я попытался сгруппировать "JobCreatedDate" безуспешно, и я не мог понять логику необходимого запроса.

Вот пример того, чтоЯ пытаюсь сделать:

Here is an example

Спасибо за помощь.

Ответы [ 2 ]

2 голосов
/ 08 августа 2011

Вам нужно найти разницу дат между today и полем JobCreated. Затем, основываясь на разнице в стоимостных днях, вам необходимо классифицировать выходные данные соответственно по различным категориям в соответствии с вашими требованиями.

Надеюсь, это то, что вы ищете.

SELECT  SUM(1)  AS [AnyTime]
    ,   SUM(CASE WHEN DayCount = 1                  THEN 1 ELSE 0 END)  AS [1 day ago]
    ,   SUM(CASE WHEN DayCount BETWEEN 2 AND 7      THEN 1 ELSE 0 END)  AS [2-7 days ago]
    ,   SUM(CASE WHEN DayCount BETWEEN 8 AND 14     THEN 1 ELSE 0 END)  AS [8-14 days ago]
    ,   SUM(CASE WHEN DayCount BETWEEN 15 AND 30    THEN 1 ELSE 0 END)  AS [15-30 days ago]
FROM    
(
    SELECT      JobID
            ,   DATEDIFF(d, JobCreatedDate, GETDATE()) AS DayCount
    FROM        dbo.Jobs
) Jobs

На снимке экрана показаны примеры данных и результаты запроса.

Output

0 голосов
/ 08 августа 2011

Используйте метод DATEADD tsql.

Select ...
From [Table]
Where JobCreatedDate between DATEADD(dd, @NumDays, GetDate()) and GetDate()

В этом запросе @NumDays - это параметр, представляющий количество дней, которые нужно вычесть из текущей даты. Убедитесь, что вы передали отрицательный номер в запрос. Если вы пытаетесь создать неинклюзивные диапазоны, вам нужно использовать два вызова DATEADD, передавая два параметра в запрос.

EDIT Я неправильно понял, что вы пытались сделать. Возможно, это не самое элегантное решение, но вы могли бы достичь своей цели с помощью запроса объединения.

Select sum(OneDay) as OneDay, sum(SevenDays) as SevenDays
From
 (select 1 as OneDay, 0 as SevenDays
  From [table]
  Where JobCreatedDate between DATEADD(dd, -1, GetDate()) and GetDate())
  UNION
 (select 0 as OneDay, 1 as SevenDays
  From[table]
  Where JobCreatedDate between DATEADD(dd, -7, GetDate()) and DATEADD(dd, -2, GetDate()))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...