我有一个常见的表表达式
WITH total_hour
AS (
SELECT
employee_id,
SUM(ROUND(CAST(DATEDIFF(MINUTE, start_time, finish_time) AS NUMERIC(18, 0)) / 60, 2)) AS total_h
FROM Timesheet t
WHERE t.employee_id = @employee_id
AND DENSE_RANK() OVER (
ORDER BY DATEDIFF(DAY, '20130925', date_worked) / 7 DESC ) = @rank
GROUP BY t.personnel_id
)这是示例数据:
ID employee_id worked_date start_time finish_time
1 1 2013-09-25 09:00:00 17:30:00
2 1 2013-09-26 07:00:00 17:00:00
8 1 2013-10-01 09:00:00 17:00:00
9 1 2013-10-04 09:00:00 17:00:00
12 1 2013-10-07 09:00:00 17:00:00
13 1 2013-10-30 09:00:00 17:00:00
14 1 2013-10-28 09:00:00 17:00:00
15 1 2013-11-01 09:00:00 17:00:00假设星期三是一周的第一天,我的基准日期是2013-09-25。我想得到的总工作时数从09-25到10-01当@排名是1,总小时从10-02到10-08,当@rank=2等等。
谢谢
发布于 2013-10-07 12:09:20
要想获得员工在一周内工作的小时数,只需使用合适的工作地点标准即可。不需要为此使用DENSE_RANK或类似的窗口函数。
假设您有一个@Week参数,它包含一个整数(当前周为0,上周为1,前一周为2,等等):
SELECT
employee_id
SUM(ROUND(CAST(DATEDIFF(MINUTE, start_time, finish_time) AS NUMERIC(18, 0)) / 60, 2)) AS total_h
FROM
Timesheet t
WHERE
t.employee_id = @employee_id AND
date_worked BETWEEN DATEADD(ww, DATEDIFF(ww,0,GETDATE()) - @Week, 0)
AND DATEADD(ww, DATEDIFF(ww,0,GETDATE()) - @Week, 0) + 7在这里,我使用了当前日期(GETDATE())作为基准日期,但是如果需要的话,可以用20130925替换它。
https://stackoverflow.com/questions/19223671
复制相似问题