我有一个应用程序,用户可以输入睡眠和唤醒时间作为数字。我需要一个存储过程来计算每天睡觉的总小时数。例如。如果用户在晚上10点睡觉,午夜前睡觉,并在凌晨5点醒来,那么睡觉的总时间是7小时。但如果用户在凌晨1点睡觉并在5点醒来,那么睡觉的总小时数是4小时。
我的数学很慢,所以我需要你聪明人的帮助。感谢。
答案 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
)