做很多的手工字符串格式化。SQL Server的时间数据类型用于保存一天中的某个时间,而不是时间间隔。因此,它只设置为保存值>=00:00和24:00。它无法存储此范围之外的任何内容。错误:Msg 207,级别16,状态1,第30行无效列名“totalti
做很多的手工字符串格式化。SQL Server的时间数据类型用于保存一天中的某个时间,而不是时间间隔。因此,它只设置为保存值>=00:00和24:00。它无法存储此范围之外的任何内容。错误:Msg 207,级别16,状态1,第30行无效列名“totalti,sql,sql-server,tsql,sql-server-2012,Sql,Sql Server,Tsql,Sql Server 2012,做很多的手工字符串格式化。SQL Server的时间数据类型用于保存一天中的某个时间,而不是时间间隔。因此,它只设置为保存值>=00:00和24:00。它无法存储此范围之外的任何内容。错误:Msg 207,级别16,状态1,第30行无效列名“totaltime”。错误:对于timeIn 14:49和timeOut 15:20,它给出超时时间=23:29,而totaltime=00“31对不起,先生,我不知道这一点,事实上,它显示:之后的第二个值正确,但第一个值为假,例如,-23:29应该是-00
做很多的手工字符串格式化。SQL Server的
时间
数据类型用于保存一天中的某个时间,而不是时间间隔。因此,它只设置为保存值>=00:00
和24:00
。它无法存储此范围之外的任何内容。错误:Msg 207,级别16,状态1,第30行无效列名“totaltime”。错误:对于timeIn 14:49和timeOut 15:20,它给出超时时间=23:29,而totaltime=00“31对不起,先生,我不知道这一点,事实上,它显示:之后的第二个值正确,但第一个值为假,例如,-23:29应该是-00:29,-18:01应该是-00:01请查看修订的查询错误:Msg 241,级别16,状态1,第1行从字符串转换日期和/或时间时转换失败。更改为char(6)转换为正的超时现在它显示负号,但值是错误的,例如-23:29或-18:01,对于总时间为05:59代码更改的人。请尝试使用小于运算符中的数据类型datetime和time不兼容。令人惊讶的是,但仍然存在一个问题,它没有显示带值的(-)减号Intime:14:49 OutTime:15:20加班时间:07:29应该是-07:29将负号放在它前面。“-”+转换(char(5),cast(dateadd(hour,0,'08:00')-(LastOutTime-FirstInTime)作为时间),108)
with times as (
SELECT t1.EmplID
, t3.EmplName
, min(t1.RecTime) AS InTime
, max(t2.RecTime) AS [TimeOut]
, cast(min(t1.RecTime) as datetime) AS InTimeSub
, cast(max(t2.RecTime) as datetime) AS TimeOutSub
, t1.RecDate AS [DateVisited]
FROM AtdRecord t1
INNER JOIN
AtdRecord t2
ON t1.EmplID = t2.EmplID
AND t1.RecDate = t2.RecDate
AND t1.RecTime < t2.RecTime
inner join
HrEmployee t3
ON t3.EmplID = t1.EmplID
group by
t1.EmplID
, t3.EmplName
, t1.RecDate
)
SELECT EmplID
,EmplName
,InTime
,[TimeOut]
,[DateVisited]
,convert(char(5),cast([TimeOutSub] - InTimeSub as time), 108) totaltime
,convert(char(5), case when TimeOutSub - InTimeSub >= '08:01' then
cast(TimeOutSub - dateadd(hour, 8, InTimeSub) as time) else '00:00' end, 108) as overtime
FROM times
SELECT EmplID
,EmplName
,InTime
,[TimeOut]
,[DateVisited]
,convert(char(5),cast([TimeOutSub] - InTimeSub as time), 108) totaltime
,convert(char(6),
CASE WHEN TimeOutSub - InTimeSub >= '08:00'
THEN convert(char(5),cast(TimeOutSub - dateadd(hour, 8, InTimeSub) as time))
ELSE '-' + convert(char(5),'08:00' - CAST(TimeOutSub-InTimeSub AS time))
END
,108) as overtime
FROM times
case when cast([TimeOutSub] - InTimeSub as time) < CAST('08:00' AS TIME) then '-' + convert(char(5), cast(dateadd(hour, 0, '08:00' ) - ([TimeOutSub] - InTimeSub) as time), 108) ELSE convert(char(5), (TimeOutSub- InTimeSub ) - cast(dateadd(hour, 0, '08:00' ) as time), 108) end as overtime
SELECT EmplID
,EmplName
,InTime
,[TimeOut]
,[DateVisited]
,convert(char(5),cast([TimeOutSub] - InTimeSub as time), 108) totaltime
,case when cast([TimeOutSub] - InTimeSub as time) < CAST('08:00' AS TIME) then '-' + convert(char(5), cast(dateadd(hour, 0, '08:00' ) - ([TimeOutSub] - InTimeSub) as time), 108) ELSE convert(char(5), (TimeOutSub- InTimeSub ) - cast(dateadd(hour, 0, '08:00' ) as time), 108) end as overtime
FROM times
with times as (
SELECT t1.EmplID
, t3.EmplName
, min(t1.RecTime) AS InTime
, max(t2.RecTime) AS [TimeOut]
, cast(min(t1.RecTime) as datetime) AS InTimeSub
, cast(max(t2.RecTime) as datetime) AS TimeOutSub
, t1.RecDate AS [DateVisited]
FROM AtdRecord t1
INNER JOIN
AtdRecord t2
ON t1.EmplID = t2.EmplID
AND t1.RecDate = t2.RecDate
AND t1.RecTime < t2.RecTime
inner join
HrEmployee t3
ON t3.EmplID = t1.EmplID
group by
t1.EmplID
, t3.EmplName
, t1.RecDate
)
SELECT EmplID
,EmplName
,InTime
,[TimeOut]
,[DateVisited]
,convert(char(5),cast([TimeOutSub] - InTimeSub as time), 108) totaltime
,convert(char(5), case when TimeOutSub - InTimeSub >= '08:01' then
cast(TimeOutSub - dateadd(hour, 8, InTimeSub) as time) else cast(8 - (TimeOutSub - InTimeSub) as time) end, 108) as overtime
FROM times
-- Try This, I just changed the condition of case TimeOutSub - InTimeSub <> '08:00'
-- and character length to 6 for negative value, All the Best!!!
with times as (
SELECT t1.EmplID
, t3.EmplName
, min(t1.RecTime) AS InTime
, max(t2.RecTime) AS [TimeOut]
, cast(min(t1.RecTime) as datetime) AS InTimeSub
, cast(max(t2.RecTime) as datetime) AS TimeOutSub
, t1.RecDate AS [DateVisited]
FROM AtdRecord t1
INNER JOIN
AtdRecord t2
ON t1.EmplID = t2.EmplID
AND t1.RecDate = t2.RecDate
AND t1.RecTime < t2.RecTime
inner join
HrEmployee t3
ON t3.EmplID = t1.EmplID
group by
t1.EmplID
, t3.EmplName
, t1.RecDate
)
SELECT EmplID
,EmplName
,InTime
,[TimeOut]
,[DateVisited]
,convert(char(5),cast([TimeOutSub] - InTimeSub as time), 108) totaltime
,convert(char(6),
case when TimeOutSub - InTimeSub <> '08:00' then cast(TimeOutSub - dateadd(hour, 8, InTimeSub) as time)
else '00:00' end, 108) as overtime
FROM times
CREATE FUNCTION GetWorkHours(@INTime AS DateTime, @OutTime AS DateTime,@WorkingHrsINMinutes AS INT)
RETURNS @WorkHours TABLE
(
WorkHours Varchar(6),
OTHours Varchar(6)
)
AS
BEGIN
INSERT INTO @WorkHours
SELECT CAST((DATEDIFF(Minute, @INTime, @OutTime)) / 60 AS VARCHAR(2))+ ':'
+ CAST((DATEDIFF(Minute, @INTime, @OutTime)) % 60 AS VARCHAR(2)) AS TotalTime,
CASE
WHEN DATEDIFF(Minute, @INTime, @OutTime) > @WorkingHrsINMinutes
THEN CAST((DATEDIFF(Minute, @INTime, @OutTime) -@WorkingHrsINMinutes) / 60 AS VARCHAR(2))+ ':' +
CAST((DATEDIFF(Minute, @INTime, @OutTime) -@WorkingHrsINMinutes) % 60 AS VARCHAR(2))
WHEN DATEDIFF(Minute, @INTime, @OutTime) < @WorkingHrsINMinutes
THEN '-' +
CAST((DATEDIFF(Minute, @INTime, @OutTime) -@WorkingHrsINMinutes) / 60 AS VARCHAR(2))+ ':' +
CAST((ABS(DATEDIFF(Minute, @INTime, @OutTime) -@WorkingHrsINMinutes)) % 60 AS VARCHAR(2))
ELSE '00:00'
END AS OverTime
RETURN
END
GO
SELECT * From Dbo.GetWorkHours('2014-01-22 10:00:09.270','2014-01-22 18:10:09.270','480')
SELECT * From Dbo.GetWorkHours('2014-01-22 10:00:09.270','2014-01-22 17:10:09.270','480')