如何将int转换为时间(例如,将“ 1930”转换为“ 19:30”),并以小时和分钟(HH:MM)为单位获取开始时间和结束时间之间的差?

cojimarmiami

我的桌子上有2列,其中包含进出时间。我需要减去它们并获得花费的时间,甚至将它们转换为时间或任何其他方式。

CREATE TABLE [dbo].[FELData](
    [RCIN1] [numeric](4, 0) NOT NULL,
    [RCOUT1] [numeric](4, 0) NOT NULL
) ON [PRIMARY]

RCIN1        RCOUT1     Desire Result
150          1930       17:40
615          1747       11:32
410          1830       14:20
400          1600       12:00

这是我到目前为止所做的,但是没有返回正确的数字

SELECT rcin1, rcout1, DATEDIFF(mi,
    CAST(STUFF(RIGHT('0'+CAST(rcin1 AS VARCHAR(8)),4),3,0,':') AS DATETIME),
    CAST(STUFF(RIGHT('0'+CAST(rcout1 AS VARCHAR(8)),4),3,0,':') AS DATETIME)
    )/60.0 AS [Hours]   
FROM FELData;

RCIN1        RCOUT1     Returning
150          1930       17.66
615          1747       11.53
410          1830       13.25
400          1600       12.83

我怎样才能解决这个问题?

更新

有时可能会出现用户数据输入错误,例如

RCIN1        RCOUT1     Returning
49          1930        Should return 0

谢谢

哈宝

这几乎可以满足您的要求,但是它无法识别1930年49是错误数据。你怎么知道的?

由于您拥有的数据是数字数据,因此无需将其转换为散文,拆分,解析,转换,重组,...。算一算!

[更新代码]

-- Sample data.
declare @Samples as Table ( RCIn1 Numeric(4,0), RCOut1 Numeric(4,0) );
insert into @Samples ( RCIn1, RCOut1 ) values
  ( 150, 1930 ), ( 615, 1747 ),  ( 410, 1830 ), ( 400, 1600 ),
  ( 49, 1930 ); -- This is allegedly "bad" data, but no explanation is given.
select * from @Samples;

with
  -- Numeric values converted to instances of TIME datatype.
  Times as (
    select RCIn1, RCOut1,
      Cast( DateAdd( minute, Floor( RCIn1 / 100 ) * 60 + RCIn1 % 100, 0 ) as Time ) as RCIn1Time,
      Cast( DateAdd( minute, Floor( RCOut1 / 100 ) * 60 + RCOut1 % 100, 0 ) as Time ) as RCOut1Time
    from @Samples )
  -- Calculate delta times.
  select *, Cast( DateAdd( minute, DateDiff( minute, RCIn1Time, RCOut1Time ), 0 ) as Time ) as DeltaTime
    from Times

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

Related 相关文章

热门标签

归档