我的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结合起来。
有什么想法以最短的方式做到这一点?
答案 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)
公式的原因是我对大多数(如果不是全部)我的日期/时间操作使用相同的基本结构(例如,您可以使用非常类似的东西从日期时间中删除时间部分值)
我还要补充说,如果你对模式有一些控制权,我可以建议两个变化 - 最强的是将两个列合并为一个日期时间列。如果这不可行(例如,由于无法更改插入/更新这些值的应用程序),并且这种类型的查询将是常见的,我建议使用计算列添加到此表,使用上面的公式。然后,您可以以更直接的方式编写查询(如有必要,可以对列进行索引)。