sql - 连接+时间差

标签 sql sql-server t-sql datetime sql-server-2012

我们目前有以下列:

CustomerID         int
ArrivalDateTime    datetime
CheckPoint         varchar(20)
DepartureDateTime  datetime

CheckPoint 列根据特定查询记录 24 小时格式的时间。

CustomerID  ArrivalDateTime      CheckPoint      DepartureDateTime
1           2015-05-03 08:15     0800            2015-05-03 08:30
2           2015-05-04 13:15     1300            2015-05-04 15:30

我需要的是将 ArrivalDateTime 中的时间替换为 CheckPoint 时间。其内容如下:

CustomerID  ArrivalDateTime          DepartureDateTime
    1       2015-05-03 08:00         2015-05-03 08:30
    2       2015-05-04 13:00         2015-05-04 15:30

这样我就可以获得从 ArrivalDateTime 到 DepartureDateTime 的时差。 预期结果:

CustomerID      ArrivalDateTime          DepartureDateTime     TimeInMinutes
        1       2015-05-03 08:00         2015-05-03 08:30      30
        2       2015-05-04 13:00         2015-05-04 15:30      150

最佳答案

试试这个:

select 
    CustomerID
    , DATEADD(day, DATEDIFF(day, 0, ArrivalDateTime), STUFF(CheckPoint_,3,0,':')) ArrivalDateTime
    , DepartureDateTime
    , DATEDIFF(mi, DATEADD(day, DATEDIFF(day, 0, ArrivalDateTime), STUFF([CheckPoint],3,0,':')), DepartureDateTime) as TimeInMinutes
from t;

如果您不想重复这些函数,您可以将它们移动到 cte 或派生表,如下所示:

select 
    CustomerID
    , ArrivalDateTime
    , DepartureDateTime
    , DATEDIFF(mi, ArrivalDateTime, DepartureDateTime) as TimeInMinutes
from (
    select 
        CustomerID
       , DATEADD(day, DATEDIFF(day, 0, ArrivalDateTime), STUFF([CheckPoint],3,0,':')) ArrivalDateTime
       , DepartureDateTime
    from t) a
;

关于sql - 连接+时间差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31600789/

相关文章:

mysql - 这个用于排名的 MySQL 触发器有什么问题?

sql - 将值传递给 Sybase 查询时,避免 Perl 中 SQL 注入(inject)的最佳方法是什么?

sql - 不能在里面有 CREATE TABLE if else

sql - 如何找出哪些 SQL 查询被阻止以及哪些内容阻止了它们?

sql - 仅计算不同值

SQL查询根据列名获取表名和行数”

sql - 查找前 n 个平均值

SQL Server 日期时间 where 子句

sql - 从 generate_series(int, int) 函数更新表 Postgres 9.0

sql - 逐行更新 SQL Table 中的数据