SQL Serverの2つの日付間の時間差(10進数)を計算するにはどうすればよいですか?


84

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

MSDNで「CONVERT」を使用して日時を10進数に変換するための便利な手法が見つかりませんでした。
誰かがそれを手伝ってくれる?

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

回答:


162

DATEDIFF(hour, start_date, end_date)との間start_dateで交差する時間境界の数が表示されますend_date

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

DATEDIFF(second, start_date, end_date) / 3600.0

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

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


いい案。ところで、同じ機能が.Netにも存在するため、これはVB.NetまたはC#で役立ちます。
ジェフ

1
DATEDIFF(MINUTE、start_date、end_date)/ 60.0
irfandar 2015

8
@irfandar dateparttoDATEDIFFは、出力の解像度を制御します。たとえばstart_dateend_dateとが59秒異なる場合、DATEDIFF(MINUTE, start_date, end_date) / 60.00を返しますが、DATEDIFF(second, start_date, end_date) / 3600.00.0163888(59/3600)を返します。
フィル・ロス

このソリューションは、整数を返すだけです。時差がわずか15分である場合、時間は0を返します。次の解決策がより現実的だと思います。
Asad Naeem

1
@AsadNaeemソリューション(DATEDIFF1時間よりも高い解像度で使用)は機能します。たとえば、SELECT DATEDIFF(second, DATEADD(minute, -15, GETUTCDATE()), GETUTCDATE()) / 3600.00.250000を返します。
フィル・ロス

15

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番目の整数(時刻を表す)が真夜中からの(1ティック数であるためです。(SmallDatetimesの場合、時間部分の整数は深夜からの分数です)。値に対して行われる算術は、時間部分を1日の端数として使用します。6am = 0.25、noon = 0.5など...詳細については、MSDNリンクを参照してください。

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

注1:これはdotNetまたはjavaScriptティックと同じではありません-このティックは約3.33ミリ秒です。


いいトリック。SQLには名前付き定数を含める必要があります。24と入力すると汚れたように感じましたが、それがロナルド・マクドナルドではないことで得られるものだと思います。
アレン

10

DATEDIFFですが、整数を返すことに注意してください。時間の端数が必要な場合は、次のようなものを使用してください。-

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

2

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」のような出力が得られました


0
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


1
DateDiff()はintを返します。10進数にキャストすることもできますが、仮数はすでに切り捨てられています。
Joel Coehoorn 2009年

0

おそらくDATEDIFF関数を探しています。

DATEDIFF(datepart、startdate、enddate)

コードを書く場所は次のようになります。

DATEDIFF(hh、startdate、enddate)


1
'hh'間隔は、彼が望むことを実行しません。彼は小数時間を計算できるように、より短い間隔が必要です。
Joel Coehoorn 2009年

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

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

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

-1

SELECT DATEDIFF(hh、firstDate、secondDate)FROM tableName WHERE .. ..


DateDiff()はintを返します。10進数にキャストすることもできますが、仮数はすでに切り捨てられています。
Joel Coehoorn 2009年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.