sql分时段查询解决办法
sql分时段查询
问题描述:
现有一数据库描述如下:
id user date
2 12 2014-12-3 08:07:57
3 15 2014-12-3 08:08:53
4 15 2014-12-3 08:56:27
5 12 2014-12-3 09:07:54
6 15 2014-12-3 09:08:37
7 12 2014-12-3 09:17:34
8 15 2014-12-3 18:07:47
9 12 2014-12-3 18:08:24
需求如下:
前台需要展示的效果为
编号 日期 用户 第一次记录 最后一次记录 当天刷卡详细记录
所以需要根据用户获取其当天08:00:00至次日凌晨07:59:59的刷卡记录,
并取该用户的第一次记录时间与最后一次记录时间
请问大牛们sql该怎么写,或提供思路。
------解决思路----------------------
------解决思路----------------------
当天刷卡详细记录是如何展示的?
------解决思路----------------------
问题描述:
现有一数据库描述如下:
id user date
2 12 2014-12-3 08:07:57
3 15 2014-12-3 08:08:53
4 15 2014-12-3 08:56:27
5 12 2014-12-3 09:07:54
6 15 2014-12-3 09:08:37
7 12 2014-12-3 09:17:34
8 15 2014-12-3 18:07:47
9 12 2014-12-3 18:08:24
需求如下:
前台需要展示的效果为
编号 日期 用户 第一次记录 最后一次记录 当天刷卡详细记录
所以需要根据用户获取其当天08:00:00至次日凌晨07:59:59的刷卡记录,
并取该用户的第一次记录时间与最后一次记录时间
请问大牛们sql该怎么写,或提供思路。
------解决思路----------------------
SELECT MIN(id)[编号]
,CONVERT(VARCHAR(10),DATEADD(HOUR,-8,date),120)[日期]
,[USER][用户]
,MIN(date)[第一次记录]
,MAX(date)[最后一次记录]
,STUFF((SELECT','+CONVERT(VARCHAR(30),date,120)FROM TB
WHERE CONVERT(VARCHAR(10),DATEADD(HOUR,-8,date),120)=CONVERT(VARCHAR(10),DATEADD(HOUR,-8,T.date),120)
AND [USER]=T.[USER] FOR XML PATH('')),1,1,'')[当天刷卡详细记录]
FROM TB T
GROUP BY CONVERT(VARCHAR(10),DATEADD(HOUR,-8,date),120),[USER]
------解决思路----------------------
当天刷卡详细记录是如何展示的?
------解决思路----------------------
--逻辑:1、根据日期,用户,汇总最小,最大值
;with cte as(
select left([date],9) as ldate, [user],min(date) as mindate,
max(date) as maxdate
from tb
group by left([date],9), [user]
),
--2、根据用户,当天,获取详细的打卡记录
cteRow as(
select 0 as n,ldate,[user],mindate,maxdate,
cast('
------解决思路----------------------
' as varchar(max)) as detailDate --详细打卡的时段,如08:07:57
------解决思路----------------------
08:08:53
from cte
union all
select n+1,ldate,[user],mindate,maxdate,
cteRow.detailDate+cast(right(tb.date,8) as varchar(max))+'
------解决思路----------------------
'
from cteRow
join tb
on tb.[user]=cteRow.[user] and cteRow.ldate=left(tb.date,9)
)
select * from cteRow
order by n