группировать по интервалу времени в sql - PullRequest
2 голосов
/ 06 апреля 2011

Мне нужно показать данные между временем 06:00 - 18:00 и 18:00 - 06:00

это пример запроса, который я использую. Я не могу получить данные второй группы. Как сделать?

как 1, 2, 3 приходит с 06:00 до 18:00

и 4, 5, 6 приходит с 18:00 до 06:00

SELECT     COUNT(cp.comm_pend_id) AS comm_pend_id, cp.UserID, um.Username, CONVERT(varchar, cp.submitted_date, 101) AS Date, SUM(cp.Earning) 
                      AS Earning, SUM(cp.total_commission) AS total_commission
FROM         dbo.comm_pending AS cp INNER JOIN
                      dbo.user_master AS um ON cp.UserID = um.UserID
GROUP BY cp.UserID, CONVERT(varchar, cp.submitted_date, 101), um.Username, cp.PaidStatus, CONVERT(varchar(10), cp.submitted_date, 108)
HAVING      (cp.PaidStatus = 'unpaid') AND (CONVERT(varchar(10), cp.submitted_date, 108) BETWEEN '06:00:00' AND '18:00:00')
ORDER BY cp.UserID

Ответы [ 2 ]

0 голосов
/ 06 апреля 2011

Может помочь оператор CASE. Например:

create table #times (num int, dt datetime)

insert into #times values (1,'2011-4-6 0:00:00')
insert into #times values (2,'2011-4-6 4:00:00')
insert into #times values (3,'2011-4-6 8:00:00')
insert into #times values (4,'2011-4-6 12:00:00')
insert into #times values (5,'2011-4-6 16:00:00')
insert into #times values (6,'2011-4-6 20:00:00')

select 
    sum(case when (datepart(hh,dt) between 6 and 17) then num else 0 end) as daySum,
    sum(case when (datepart(hh,dt) not between 6 and 17) then num else 0 end) as nightSum
from #times
0 голосов
/ 06 апреля 2011

Невозможно получить вторую группу, потому что 18:00 больше 06:00, поэтому между ними нет ничего в тот же день. Для второй группы вы должны отфильтровать это так:

((CONVERT(varchar(10), cp.submitted_date, 108) < '06:00:00' 
 OR 
(CONVERT(varchar(10), cp.submitted_date, 108) > '18:00:00')
...