做很多的手工字符串格式化。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')