【发布时间】:2011-08-16 16:17:49
【问题描述】:
我的桌子是这样的:
select clocktime, for_UID, in1_out0 from timeclockentries
clocktime for_UID in1_out0
2011-08-07 15:13:58.390 user193 1
2011-08-07 21:09:45.093 user193 0
2011-08-09 14:10:00.000 user193 1
2011-08-09 20:10:00.000 user193 0
我希望结果看起来像(假设一周的开始是星期六),由名为“day1”、“day2”等的列分隔......(但为了便于阅读,我用换行符输入了它们) :
day1 day2 day3
1900-01-01 00:00:00.000 1900-01-01 05:55:46.700 1900-01-01 00:00:00.000
day4 day5 day6
1900-01-01 06:00:00.000 1900-01-01 00:00:00.000 1900-01-01 00:00:00.000
day7
1900-01-01 00:00:00.000
(我用的是sql2005)
以下是我一天使用的:
CREATE PROCEDURE [dbo].[sp_gethoursbyday]
@whichforUID varchar(20),
@whichdate datetime
AS
BEGIN
;WITH CTE as(
SELECT
DENSE_RANK() over (Partition by for_UID , in1_out0 Order by clocktime) id,
clocktime,
for_UID,
in1_out0
FROM
kdhcastle.dbo.timeclockentries tc
WHERE
tc.for_UID = @whichforUID
and month(tc.[clocktime]) = month(@whichdate)
and day(tc.[clocktime]) = day(@whichdate)
and year(tc.[clocktime]) = year(@whichdate)
)
SELECT
Cast(cast(sum(
cast(outTime.clocktime as float) - cast(inTime.clocktime as float)
)as datetime) as datetime) as 'hoursbydy'
FROM
CTE inTime
INNER JOIN CTE outTime
ON inTime.for_UID = outTime.for_UID
AND inTime.id = outTime.id
AND inTime.in1_out0 = 1
and outTime.in1_out0 = 0
END
【问题讨论】:
-
是否可以保证每个用户每天总是恰好有 0 或 2 条记录,并且数据只会涵盖 7 天的时间段?您想将 UID 作为列添加到您的新输出中吗?
-
输出不需要 UID。每个用户每天可能有无限数量的记录。总是 7 天。
-
还有其他(更重要的)问题吗?
标签: sql sql-server sql-server-2005