sql - 计算给定结束时间 (datetime2) 和持续时间 (time(7)) 的开始时间

标签 sql sql-server sql-server-2008

DECLARE @TABLE TABLE (ID INT IDENTITY(1,1), FinalDateTime Datetime2(7), 
 ElapsedTime Time(7))

INSERT INTO @TABLE (FinalDateTime, ElapsedTime)
SELECT '2014-01-21 00:00:00.1110010','12:00:00.1100009' 
  -- Expected Output = '2014-01-20 12:00:00.0010001'
UNION ALL
SELECT '2014-01-20 14:00:00.1110010','02:00:00.1100009' 
  -- Expected Output = '2014-01-20 12:00:00.0010001'
UNION ALL
SELECT '2014-01-20 12:02:00.1110010','00:02:00.1100009' 
  -- Expected Output = '2014-01-20 12:00:00.0010001'
UNION ALL
SELECT '2014-01-20 12:00:02.1110010','00:00:02.1100009' 
  -- Expected Output = '2014-01-20 12:00:00.0010001'
UNION ALL
SELECT '2014-01-20 12:00:00.1110010','00:00:00.1100009' 
  -- Expected Output = '2014-01-20 12:00:00.0010001'

SELECT * FROM @TABLE

我想从 Datetime2(7) 中减去 time(7)。我不知道如何减去整个时间,而不是分别减去 HH/MM/SS/MS。

最佳答案

由于粒度的原因,需要单独进行纳秒计算。因此,减去以整秒为单位的耗时,然后减去纳秒部分。

DECLARE @TABLE TABLE (FinalDateTime Datetime2(7), ElapsedTime Time(7));

INSERT INTO @TABLE (FinalDateTime, ElapsedTime) VALUES
('2014-01-21 00:00:00.1110010','12:00:00.1100009'),
('2014-01-20 14:00:00.1110010','02:00:00.1100009'),
('2014-01-20 12:02:00.1110010','00:02:00.1100009'),
('2014-01-20 12:00:02.1110010','00:00:02.1100009'),
('2014-01-20 12:00:00.1110010','00:00:00.1100009');

;WITH x AS 
(
  SELECT 
    FinalDateTime, 
    ElapsedTime,
    ElapsedSeconds = DATEDIFF(SECOND, '0:00', ElapsedTime),
    AdditionalNanoseconds = DATEPART(NANOSECOND, ElapsedTime)
  FROM @TABLE
)
SELECT 
  FinalDateTime, 
  ElapsedTime, 
  StartTime = DATEADD(NANOSECOND, -AdditionalNanoseconds, 
    DATEADD(SECOND, -ElapsedSeconds, FinalDateTime)
  ) 
FROM x;

当然,你可以做得更简洁,我只是觉得CTE有助于表达步骤。

SELECT 
  FinalDateTime, 
  ElapsedTime, 
  StartTime = DATEADD(NANOSECOND, -(DATEPART(NANOSECOND, ElapsedTime)), 
    DATEADD(SECOND, -(DATEDIFF(SECOND, '0:00', ElapsedTime)), FinalDateTime)
  ) 
FROM @TABLE;

关于sql - 计算给定结束时间 (datetime2) 和持续时间 (time(7)) 的开始时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21244556/

相关文章:

SQL(sqlite)比较由另一个重复行分组的行的总和

mysql - SQL 仅显示计数函数的最大值

Sql Server - 如何根据纬度/经度最小值最大值查询地理列

sql - 存储过程声明 T-SQL 中的嵌套创建类型

sql-server - 当 UPDATE 的结果不明确时,为什么 SQL Server 不会失败?

php - 为具有多个值的字段返回多个标签

sql-server - 在多个统计信息中具有相同的列

sql-server - 存储过程/CHANGETABLE 函数带参数慢,带文字快

sql - 为什么将 AVG(intger_column) 转换为 DECIMAL 返回至少六位小数?

sql - 为数据组选择 DISTINCT