web-dev-qa-db-ja.com

SQL Serverの2つの日付の時間の差(10進数)を計算する方法は?

SQL Server 2008の2つの日付の時間(10進型)の差を計算する必要があります。

MSDNで 'CONVERT'を使用してdatetimeを10進数に変換する便利なテクニックが見つかりませんでした。
誰でも私を助けてくれますか?

更新:
明確にするために、小数部も必要です(したがって10進数型)。したがって、9:00から10:30に1.5が返されます。

75
Marc

DATEDIFF(hour, start_date, end_date)は、start_dateend_dateの間の時間境界の数を示します。

小数時間数が必要な場合は、DATEDIFFをより高い解像度で使用し、結果を除算できます。

DATEDIFF(second, start_date, end_date) / 3600.0

DATEDIFFのドキュメントは、MSDNで入手できます。

http://msdn.Microsoft.com/en-us/library/ms189794%28SQL.105%29.aspx

146
Phil Ross

2つの日時値を減算して24を掛けるだけです。

  Select Cast((@DateTime2 - @DateTime1) as Float) * 24.0

テストスクリプトは次のようになります。

  Declare @Dt1 dateTime Set @Dt1 = '12 Jan 2009 11:34:12'
  Declare @Dt2 dateTime Set @Dt2 = getdate()

  Select Cast((@Dt2 - @Dt1) as Float) * 24.0

これは、すべての日時が整数のペアとして内部的に保存され、最初の整数が1900年1月1日からの日数であり、2番目の整数(時刻を表す)が(の数であるため、 1ticks真夜中から。 (SmallDatetimesの場合、時間部分の整数は真夜中からの分数です)。値に対して実行される算術演算では、時間部分が1日の端数として使用されます。 6am = 0.25、正午= 0.5など。詳細については、 MSDNリンクはこちら を参照してください。

したがって、Cast((@ Dt2-@ Dt1)as Float)は、2つの日付時刻間の合計日数を提供します。 24を掛けて時間に変換します。合計分が必要な場合は、24分ではなく1日あたりの分数(24 * 60 = 1440).

注1:これはdotNetまたはjavaScriptティックとは異なります-このティックは約3.33ミリ秒です。

14
Charles Bretana

DATEDIFFは整数を返しますので、時間の小数部が必要な場合は次のようなものを使用してください。

CAST(DATEDIFF(ss, startDate, endDate) AS decimal(precision, scale)) / 3600
9
AnthonyWJones

Postgresを使用すると、DATEDIFFで問題が発生しましたが、これで成功しました。

  DATE_PART('day',(delivery_time)::timestamp - (placed_time)::timestamp) * 24 + 
  DATE_PART('hour',(delivery_time)::timestamp - (placed_time)::timestamp) +
  DATE_PART('minute',(delivery_time)::timestamp - (placed_time)::timestamp) / 60

「14.3」のような出力が得られました

2
Patrick Kearns
Declare @date1 datetime
Declare @date2 datetime

Set @date1 = '11/20/2009 11:00:00 AM'
Set @date2 = '11/20/2009 12:00:00 PM'

Select Cast(DateDiff(hh, @date1, @date2) as decimal(3,2)) as HoursApart

結果= 1.00

0
kd7

おそらく DATEDIFF 関数を探しているでしょう。

DATEDIFF(datepart、startdate、enddate)

コーディングする場所は次のようになります。

DATEDIFF(hh、startdate、enddate)

0
DATEDIFF(minute,startdate,enddate)/60.0)

または、これを小数点以下2桁で使用します。

CAST(DATEDIFF(minute,startdate,enddate)/60.0 as decimal(18,2))
0
mind