Доступ к SQL-запросу - группировка по диапазону дат (после полуночной проблемы) - PullRequest
2 голосов
/ 26 января 2011

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

Я пробовал это:

SELECT RecordedOnDate, COUNT(RecordedOnDate) AS RowCount, COUNT(SongID) AS [Total Amount]
FROM InfoTable
WHERE (RecordedOnDate > DateAdd('h', 5, #1/23/2011#)) AND (RecordedOnDate < DateAdd('h', 5, #1/24/2011#))
GROUP BY RecordedOnDate
ORDER BY RecordedOnDate DESC

но не может GROUP BY Спасибо

Ответы [ 2 ]

2 голосов
/ 26 января 2011

То, что вы хотите сделать, это сместить время на 5 часов, чтобы они «появились» в предыдущий день.

SELECT
    DateAdd('h', -5, RecordedOnDate) RecordedOnDate,
    COUNT(RecordedOnDate) AS RowCount,
    COUNT(SongID) AS [Total Amount]
FROM InfoTable
WHERE (RecordedOnDate > DateAdd('h', 5, #1/23/2011#)) AND (RecordedOnDate < DateAdd('h', 5, #1/24/2011#))
GROUP BY DateAdd('h', -5, RecordedOnDate)
ORDER BY RecordedOnDate DESC

Исправьте предложение WHERE, как вам требуется, но оно будет группироваться с 5 утра до 5 утра следующего дня как "сегодня"

0 голосов
/ 26 января 2011

Будет ли это работать?Я пытаюсь сначала сместить, затем сгруппировать и сгруппировать по смещенной и округленной дате.Добавьте / обновите предложение WHERE, чтобы отфильтровать интересующий диапазон дат.

;WITH Shifted(sday, smonth, syear)
AS (
  SELECT 
    DatePart(day, DateAdd('h', -5, RecordedOnDate)) sday,
    DatePart(month, DateAdd('h', -5, RecordedOnDate)) smonth,
    DatePart(year, DateAdd('h', -5, RecordedOnDate)) syear
  FROM Table
)
SELECT 
  -- recreate the date
  DateAdd(day, sday - 1, DateAdd(month, smonth - 1, DateAdd(Year, syear - 1900, 0))) RD,
  -- aggregate the count for the shifted date
  COUNT(*)
FROM Shifted
GROUP BY 
  DateAdd(day, sday - 1, DateAdd(month, smonth - 1, DateAdd(Year, syear - 1900, 0)))
...