【发布时间】:2017-11-12 16:23:21
【问题描述】:
我有以下查看查询。在计算时间间隔时,如果签出是同一日期,则仅显示时间间隔。例如,如果我在 2017 年 11 月 12 日入住,那么我必须在 201 年 11 月 12 日相同的日期退房,以便计算时间间隔。
但是我想修改它,就像我在第二天(午夜 12:00 AM 之后)结账时一样,它还应该计算时间间隔。可以帮我修改查询以获得所需的结果吗?
查询:
ALTER VIEW [dbo].[TimeAttendanceQuery]
AS
SELECT TOP (100) PERCENT
dbo.AxPerson.Name,
dbo.AxPerson.IdNumber AS EmployeeID,
dbo.TimeAttendance.Badge,
dbo.AxPerson.Id,
MIN(dbo.TimeAttendance.EventTime) AS EntryTime,
MAX(dbo.TimeAttendance.EventTime) AS ExitTime,
CAST(DATEDIFF(second, MIN(dbo.TimeAttendance.EventTime), MAX(dbo.TimeAttendance.EventTime)) / 60 / 60 / 24 AS NVARCHAR(50)) +
':' + CAST(DATEDIFF(second, MIN(dbo.TimeAttendance.EventTime), MAX(dbo.TimeAttendance.EventTime)) / 60 / 60 % 24 AS NVARCHAR(50)) + ':' + CAST(DATEDIFF(second, MIN(dbo.TimeAttendance.EventTime), MAX(dbo.TimeAttendance.EventTime)) / 60 % 60 AS NVARCHAR(50))
AS TimeInterval,
dbo.TimeAttendance.Event,
dbo.AxPerson.Type AS ShitType,
dbo.AxPerson.ShiftDesc,
CONVERT(Varchar,dbo.TimeAttendance.EventTime, 101) AS EventTIME
FROM
dbo.AxPerson
INNER JOIN dbo.TimeAttendance ON dbo.AxPerson.Name = dbo.TimeAttendance.Name
GROUP BY dbo.AxPerson.Name, dbo.AxPerson.IdNumber, dbo.TimeAttendance.Badge, CONVERT(Varchar, dbo.TimeAttendance.EventTime, 101), dbo. AxPerson.ShiftDesc, dbo.AxPerson.Id, dbo.TimeAttendance.Event,dbo.AxPerson.Type
ORDER BY dbo.AxPerson.Name, EventTime DESC
GO
【问题讨论】:
-
您有确定事件类型的列吗?是的,签到事件的值是多少,结帐事件的值是多少?
-
删除
TOP(100) PERCENT和ORDER BY,因为它们在视图定义中是多余的。您需要在使用视图的SELECT语句中指定ORDER BY以保证结果集排序。 -
样本数据和期望的结果会有所帮助。
-
@DawoodAwan 是的,我确实有一列告诉事件是 entry r exit
标签: sql sql-server database sql-server-2008