在SQL Server中组合或拆分日期和时间

时间:2010-12-30 08:09:35

标签: sql-server sql-server-2005

我的sql-server中有3列,即

Appt Time            Call Date             Call Time.
14-01-2011 09:00:00  14-01-0211 00:00:00   01-01-1980 08:52:00

我想计算这家伙来得早或晚。

所以我需要做Appt Time - Call Time.

但是,随着数据的提供,我需要将Appt Time的Date部分更改为01-01-1980,或者将Date部分和Time部分从Call Date和Call Time结合起来。

有什么想法以最短的方式做到这一点?

2 个答案:

答案 0 :(得分:2)

SELECT [Appt Time] - ([Call Date] + DATEADD(day, -DATEDIFF(DAY, 0, '01-01-1980')`, [CallTime]))

编辑:

解释

  • DATEDIFF(DAY, 0, '19800101') = 1900年1月1日至1980年1月1日之间的日子
  • DATEADD(day, -DATEDIFF(DAY, 0, '01-01-1980'), [Call Time]) =仅限时间

然后只需添加CallDate和Calculated TimeOnly

这在SQL Server 2008中会更容易

答案 1 :(得分:0)

假设时间部分总是存储在1980年1月1日(一个不寻常的日期),那么您可以使用以下内容将CallDate和CallTime列组合在一起:

DATEADD(day,DATEDIFF(day,'19800101',CallDate),CallTime)

然后,您将再申请DATEDIFF(例如,分钟)以确定它们是早期还是晚期:

select DATEDIFF(minute,ApptTime,DATEADD(day,DATEDIFF(day,'19800101',CallDate),CallTime)) as EarlyLate
from <Table>

如果他们是早期的话会产生负面结果,如果他们迟到则会产生积极的结果。我更喜欢DATEADD(day,DATEDIFF(day,'19800101',CallDate),CallTime)公式的原因是我对大多数(如果不是全部)我的日期/时间操作使用相同的基本结构(例如,您可以使用非常类似的东西从日期时间中删除时间部分值)


我还要补充说,如果你对模式有一些控制权,我可以建议两个变化 - 最强的是将两个列合并为一个日期时间列。如果这不可行(例如,由于无法更改插入/更新这些值的应用程序),并且这种类型的查询将是常见的,我建议使用计算列添加到此表,使用上面的公式。然后,您可以以更直接的方式编写查询(如有必要,可以对列进行索引)。