SQL datediff时间计算

时间:2011-09-06 22:06:19

标签: sql tsql

我的T-SQL数据库中有这些字段 - startTimeendTime以及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)。 。
如何将这些负面时间转换为正数?

我确实有单独的日期字段 - startDateendDate

3 个答案:

答案 0 :(得分:1)

首先,我们在谈论什么数据库引擎? MS SQL Server? MySQL的?还有别的吗?

我主要使用MS SQL Server而且我不知道其他数据库引擎的datediff实现,但您的问题可能是因为startTimeendTime字段只包含时间而发生信息,但没有日期:

如果您仅datediff 23:17:2700: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)