使用datetime字段计算SQL中日期之间的差异,而不转换为char/varchar
我目前正在寻找日期之间的时差,并将其输出到小时(00:00)。然而,我接下来要对这个计算进行求和,这意味着我不能转换成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
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;