2011-01-25 3 views
2

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

Я попытался это:

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

То, что вы хотите сделать, это компенсировать раз на 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 

Исправьте ИНЕКЕ, как вам требуется, но это будет группа по 5 утра до 5 утра на следующий день, как «сегодня»

+0

+1, нет необходимости в группе, если вы выбираете только один день в 'where' – Andomar

+0

вопрос говорит«на каждый день», так что я думаю, что диапазон может измениться. Играйте в нее безопасно. – RichardTheKiwi

0

Будет ли это работать? Сначала я пытаюсь перенести группу, а затем группировать ее по сдвинутой и округленной дате. Добавить/обновить 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)))