我的T-SQL数据库中有这些字段 - startTime
和endTime
以及processTime
。
处理时间是从开始到结束时间的时间量
因此,一个startTime示例为22:50:59
,其endTime为23:14:23
处理时间为.39(当前代码):
SELECT convert( decimal(18,0), totalItems
/(datediff(ss,sessionStartTime,sessionEndTime)/60.00/60.00) )
AS processTime
这似乎在大多数情况下都有效,但是当startTime和endTime跨越一天时它不起作用 - 例如,startTime是23:17:27,endTime是00:31:23。
换句话说,他们在晚上10:17开始,并在第二天早上12:31左右结束,但是SQL没有看到这个,因为processTime显示为负数(-22.77)。 。
如何将这些负面时间转换为正数?
我确实有单独的日期字段 - startDate
和endDate
。
答案 0 :(得分:1)
首先,我们在谈论什么数据库引擎? MS SQL Server? MySQL的?还有别的吗?
我主要使用MS SQL Server而且我不知道其他数据库引擎的datediff
实现,但您的问题可能是因为startTime
和endTime
字段只包含时间而发生信息,但没有日期:
如果您仅datediff
23:17:27
和00:31:23
,那么它应该如何“决定”/“知道”您的意思是同一天?
但是,如果您将startTime
设置为2011-09-06 23:17:27
而将endTime
设置为2011-09-07 00:31:23
,那么它会起作用,因为datediff
肯定会知道endTime
不在与startTime
同一天。
答案 1 :(得分:1)
我假设您正在使用MS SQL,并且由于某种原因您正在剥离日期组件,因此日期总是相同的。您可以通过测试日期来解决这个问题,如果结束时间少于开始时间,则可以将结束时间添加到结束时间。
SELECT CONVERT(DECIMAL(18, 0), totalitems /
( CASE
WHEN sessionendtime < sessionstarttime THEN Datediff(ss, sessionstarttime, Dateadd(dd, 1,
sessionendtime ))
ELSE Datediff(ss, sessionstarttime, sessionendtime )
END)/
60.00/60.00)
如果结束时间大于开始时间后的24小时,则此解决方案存在问题
答案 2 :(得分:0)
我假设你要包括日期......(?)
以下是我运行的示例 - 似乎按预期工作:
declare @start datetime
declare @end datetime
set @start = '2011-09-06 23:17:27'
set @end = '2011-09-07 00:31:23'
select
datediff(second,@start,@end) as seconds,
datediff(minute,@start,@end) as minutes,
datediff(hour,@start,@end) as hours,
datediff(day,@start,@end) as days,
datediff(month,@start,@end) as months,
datediff(year,@start,@end) as years
结果如下:
seconds minutes hours days months years
----------- ----------- ----------- ----------- ----------- -----------
4436 74 1 1 0 0
(1 row(s) affected)
您可能要做的一件事是重新检查小数转换的范围。例如:这会产生不同的结果,具体取决于你在分割之前放置parens的位置:
declare @start datetime
declare @end datetime
set @start = '2011-09-06 23:17:27'
set @end = '2011-09-07 00:31:23'
select convert(decimal(18,0), (datediff(ss,@start,@end)))/60.00/60.00 as NEW_processTime,
convert(decimal(18,0), (datediff(ss,@start,@end)/60.00/60.00)) as ORIGINAL_processTime
以下是结果:
NEW_processTime ORIGINAL_processTime
--------------------------------------- ---------------------------------------
1.23222221666 1
(1 row(s) affected)