Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用datetime字段计算SQL中日期之间的差异,而不转换为char/varchar_Sql_Sql Server_Datetime_Duration - Fatal编程技术网

使用datetime字段计算SQL中日期之间的差异,而不转换为char/varchar

使用datetime字段计算SQL中日期之间的差异,而不转换为char/varchar,sql,sql-server,datetime,duration,Sql,Sql Server,Datetime,Duration,我目前正在寻找日期之间的时差,并将其输出到小时(00:00)。然而,我接下来要对这个计算进行求和,这意味着我不能转换成char/varchar 请参见下面的示例数据,我希望它如何显示 EMPLOYEE_ID Start End Duration 1 05/06/2015 08:30 05/06/2015 12:12 03:42 1 05/06/2015 13:18 05/06/2

我目前正在寻找日期之间的时差,并将其输出到小时(00:00)。然而,我接下来要对这个计算进行求和,这意味着我不能转换成char/varchar

请参见下面的示例数据,我希望它如何显示

EMPLOYEE_ID Start               End                 Duration
1           05/06/2015 08:30    05/06/2015 12:12    03:42
1           05/06/2015 13:18    05/06/2015 17:00    03:42
1           06/06/2015 08:30    06/06/2015 12:12    03:42
1           06/06/2015 13:18    06/06/2015 17:00    03:42
持续时间的当前代码:

CONVERT(varchar(5),DATEADD(minute,DATEDIFF(minute,Start, End),0), 114) as Duration

显然,这段代码不是我想要的,因为它是varchar,我想继续将两个持续时间相加。我四处查看了一下,但找不到任何可以说明如何完成此操作的内容。

以分钟为单位计算持续时间:

select datediff(minute, start, end) as duration_min
. . .
这更容易处理。然后总结会议记录:

select sum(datediff(minute, start, end)) as duration_min
我建议你还是这样吧。但是,如果您希望它为HH:MM格式,则手动将其转换为所需格式的字符串


不要使用
时间
数据类型。限制为24小时。

以分钟为单位计算持续时间:

select datediff(minute, start, end) as duration_min
. . .
这更容易处理。然后总结会议记录:

select sum(datediff(minute, start, end)) as duration_min
我建议你还是这样吧。但是,如果您希望它为HH:MM格式,则手动将其转换为所需格式的字符串

不要使用
时间
数据类型。它限制为24小时。

SQL Server因此,支持聚合的最佳方法是以一致的度量单位(如此处使用的分钟)计算持续时间,然后使用聚合结果计算固定日期时间值的间隔。尽管下面的示例使用
FORMAT
函数将结果转换为字符串,但我建议在表示层而不是T-SQL中进行显示格式设置

CREATE TABLE dbo.EmployTimeRecord (
      EMPLOYEE_ID int NOT NULL
    , StartTime smalldatetime NOT NULL
    , EndTime smalldatetime NOT NULL
    , DurationMinutes AS DATEDIFF(minute, StartTime, EndTime)
    );

INSERT INTO dbo.EmployTimeRecord(EMPLOYEE_ID, StartTime, EndTime)
    VALUES
      (1, '2015-05-06T08:30:00', '2015-05-06T12:12:00')
    , (1, '2015-05-06T13:18:00', '2015-05-06T17:00:00')
    , (1, '2015-05-06T08:30:00', '2015-05-06T12:12:00')
    , (1, '2015-05-06T13:18:00', '2015-05-06T17:00:00');


SELECT
      EMPLOYEE_ID
    , FORMAT(DATEADD(minute, SUM(DurationMinutes), ''), 'HH:mm') AS Duration
FROM dbo.EmployTimeRecord
GROUP BY EMPLOYEE_ID;
SQL Server因此,支持聚合的最佳方法是以一致的度量单位(如此处使用的分钟)计算持续时间,然后使用聚合结果从固定的datetime值计算间隔。尽管下面的示例使用
FORMAT
函数将结果转换为字符串,但我建议在表示层而不是T-SQL中进行显示格式设置

CREATE TABLE dbo.EmployTimeRecord (
      EMPLOYEE_ID int NOT NULL
    , StartTime smalldatetime NOT NULL
    , EndTime smalldatetime NOT NULL
    , DurationMinutes AS DATEDIFF(minute, StartTime, EndTime)
    );

INSERT INTO dbo.EmployTimeRecord(EMPLOYEE_ID, StartTime, EndTime)
    VALUES
      (1, '2015-05-06T08:30:00', '2015-05-06T12:12:00')
    , (1, '2015-05-06T13:18:00', '2015-05-06T17:00:00')
    , (1, '2015-05-06T08:30:00', '2015-05-06T12:12:00')
    , (1, '2015-05-06T13:18:00', '2015-05-06T17:00:00');


SELECT
      EMPLOYEE_ID
    , FORMAT(DATEADD(minute, SUM(DurationMinutes), ''), 'HH:mm') AS Duration
FROM dbo.EmployTimeRecord
GROUP BY EMPLOYEE_ID;