2017-03-04 27 views
0

执行算术功能我即─如何日期时间在SQL

1. C_Date in YYYYMMDD format (varchar(255)) Eg. 20161231 
2. C_Time in 4-digit Military format (varchar(255)) Eg. 2143 
3. E_Date in YYYYMMDD format (varchar(255)) Eg. 20161230 
4. E_Time in 4-digit Military format (varchar(255)) Eg. 1600 

我想要计算E事件和C事件之间的时间四列。我如何使用select语句执行此计算?

+1

哪个数据库? – McNets

+0

只需将日期和时间存储为一个实体 – Strawberry

+0

其SQL Server数据库。 –

回答

0

很简单的从组件值创建一个日期类型:

with data as (select '20161231' as c_date, '2143' as c_time) 
select 
    convert(
     datetime, 
     stuff(stuff(stuff(c_date + ' ' + c_time, 12, 0, ':'), 7, 0, '-'), 5, 0, '-'), 
     120 
    ) as c_datetime 
from data; 

使用datediff()来计算时间差。你没有指定你想要输出的样子,所以我不会猜测。尽管如此,应该还有其他100个与您的问题相关的信息。

另请注意,我没有在字符串后面追加':00'来表示秒数。这似乎工作,虽然我无法追查一份官方文件来证实这一点。所以为了安全起见,你可能也想要解决这个问题。可以说,可能会有更通用的格式,如ISO 8601这将是一个“更好”的解决方案。不过你明白了。

0

将您的字符串转换为日期时间的小问题。然后我们使用DateDiff()来计算两个日期之间的差异。

Declare @YourTable table (C_Date varchar(255),C_Time varchar(255),E_Date varchar(255),E_Time varchar(255)) 
Insert Into @YourTable values 
('20161231','2143','20161230','1600') 

;with cte as (
Select * 
     ,CDT = try_convert(DateTime,C_Date+' '+stuff(C_Time,3,0,':')) 
     ,EDT = try_convert(DateTime,E_Date+' '+stuff(E_Time,3,0,':')) 
from @YourTable 
) 
Select CDT 
     ,EDT 
     ,Duration = concat(DateDiff(DD,EDT,CDT),' ',Format(DateAdd(Second,DateDiff(SECOND,EDT,CDT),'1899-12-31'),'HH:mm:ss')) 
     ,AsSeconds = DateDiff(SECOND,EDT,CDT) 
     ,AsMinutes = DateDiff(MINUTE,EDT,CDT) 
From cte 

返回

CDT      EDT      Duration  AsSeconds AsMinutes 
2016-12-31 21:43:00  2016-12-30 16:00:00  1 05:43:00 106980  1783