2010-12-30 19 views
0

私はすなわちSQL Serverで日付と時刻を組み合わせたりSpliting

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

私は男が来るか早いか遅い計算したいと思い、私のSQLサーバに3列があります。

は、だから私は何をする必要があるAppt Time - Call Time.

しかし、データが与えられたとして、私は1980年1月1日にAPPT時刻の日付の一部を変更したり、コール日およびコールから日付部分と時刻の部分を結合する必要があります時間。

これを最短の方法で行うにはどうすればよいですか?

+0

どのSQL Serverのバージョンですか? – gbn

+0

Microsoft SQL Server 2005 – william

答えて

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

編集:

説明1900年1月1日と1980年1月1日

  • DATEADD(day, -DATEDIFF(DAY, 0, '01-01-1980'), [Call Time])

    • DATEDIFF(DAY, 0, '19800101') =日=時間だけ

    それからちょうどCallDateを追加し、計算時間のみ

    これは、時刻部分は常に1980年1月1日(珍しい日付)にあるものとして保存されていると仮定すると、SQL Server 2008の

  • 0

    で容易になるだろう、あなたは一緒にCallDateとCallTime列を結合するために、次の使用することができます:

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

    トン場合、これは陰性の結果を得られます:

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

    あなたは、彼らが早いか遅いかどうかを決定するために(分、言うために)さらにDATEDIFFを適用しますちょっと早かった、彼らが遅れていれば肯定的な結果になった。私がDATEADD(day,DATEDIFF(day,'19800101',CallDate),CallTime)の方程式を好む理由は、私の日付/時刻操作のすべてではないにしても、ほとんどの場合同じ基本構造を使用していることです(たとえば、datetime値から時間部分を取り除くのに非常に似たものを使用できます)


    また、スキーマを何らかのコントロールがある場合は、私が示唆できる2つの変更があります。最も強力なのは、2つの列を1つのdatetime列に結合することです。これが実現できない場合(たとえば、これらの値を挿入/更新するアプリケーションを変更できないため)、このタイプのクエリは一般的になります。このテーブルに計算カラムを追加することをお勧めします。上記の式。より簡単な方法でクエリを記述することができます(必要に応じて列のインデックスを作成することもできます)。

    関連する問題