计算睡眠时间和唤醒时间T-SQL之间的差异

时间:2014-08-04 10:08:18

标签: sql sql-server tsql

我有一个应用程序,用户可以输入睡眠和唤醒时间作为数字。我需要一个存储过程来计算每天睡觉的总小时数。例如。如果用户在晚上10点睡觉,午夜前睡觉,并在凌晨5点醒来,那么睡觉的总时间是7小时。但如果用户在凌晨1点睡觉并在5点醒来,那么睡觉的总小时数是4小时。

我的数学很慢,所以我需要你聪明人的帮助。感谢。

3 个答案:

答案 0 :(得分:2)

你应该使用DATEDIFF 从msdn页面:

http://msdn.microsoft.com/en-us/library/ms189794.aspx 因此,例如,获取日期并将该日期添加到5小时:

DECLARE @D1 AS DATETIME = GETDATE()
DECLARE @D2 AS DATETIME = DATEADD(HOUR,5,GETDATE())

SELECT DATEDIFF(HOUR,@D1,@D2)

DATEDIFF还允许检查DAYS,MINUTES等......

最后,如果您没有将日期存储在数据库中,则可以使用

CAST

http://msdn.microsoft.com/en-us/library/ms187928.aspx

select CAST('2014-07-01 19:25:00' as datetime)

答案 1 :(得分:0)

如果用户可以只用数字而不是日期时间格式插入睡眠和唤醒时间,那么计算睡眠时间应该很简单。最好是24小时格式。例如,如果用户在22:00睡觉并在05:00醒来,那么它是7小时的睡眠时间。

DECLARE @D1 AS INT = 22
DECLARE @D2 AS INT = 5

SELECT (24 - @D1) + @D2

答案 2 :(得分:0)

使用datetime总是很棘手,并且为了避免任何错误,我更喜欢让SQL本身执行复杂的操作。我的解决方案在HHMM中接受24小时格式并输出结果为HH:MM。希望这会有所帮助。

DECLARE @D1 AS VARCHAR(4) = 2002
DECLARE @D2 AS VARCHAR(4) = 530
DECLARE @dtD1 DATETIME
DECLARE @dtD2 DATETIME
DECLARE @SecondsSlept BIGINT

SET @D1 = RIGHT('0000' + @D1, 4)
SET @D2 = RIGHT('0000' + @D2, 4)

SET @dtD1 = STUFF(
        STUFF('20000101 00:00:00.000', 10, 2, LEFT(@D1, 2)),
        13,
        2,
        RIGHT(@D1, 2)
    )

SET @dtD2 = STUFF(
        STUFF('20000101 00:00:00.000', 10, 2, LEFT(@D2, 2)),
        13,
        2,
        RIGHT(@D2, 2)
    )


IF @dtD2 < @dtD1
    SET @dtD2 = DATEADD(dd, 1, @dtD2)

SET @SecondsSlept = DATEDIFF(s, @dtD1, @dtD2)

SELECT   CONVERT(
             VARCHAR(5),
             DATEADD(s, @SecondsSlept, '20000101 00:00:00.000'),
             114
         )