web-dev-qa-db-ja.com

SQL Server 2005のDateTimeから分を引く

値が2000-01-01 08:30:である日時フィールドと、値が:15(15分を意味する)である期間フィールドがあるとします

これら2つを差し引くと、2000-01-01 08:15:になります

また、1:15(1時間15分を意味する)を減算する場合、出力は2000-01-01 07:15:になります

SELECT DATEDIFF(minute, '00:15','2000-01-01 08:30:00');を試しています

しかし、出力は52595055です。目的の結果を得るにはどうすればよいですか?

N.B.〜SELECT dateadd(minute, -15,'2000-01-01 08:30:00');を実行すると、目的の結果が得られますが、これには分のフィールドの解析が含まれます。

編集:

答えによると、誰もがすべてを分に変換してから差し引くことを提案しています-それが1:30の場合、90分を差し引く必要があります。それはいいです。分に変換しない他の方法はありますか?

32
SELECT DATEADD(minute, -15, '2000-01-01 08:30:00'); 

2番目の値(この場合は-15)は数値でなければなりません(つまり、「00:15」のような文字列ではありません)。時間と分を減算する必要がある場合は、文字列を:で分割して時間と分を取得し、次のようなものを使用して減算することをお勧めします

SELECT DATEADD(minute, -60 * @h - @m, '2000-01-01 08:30:00'); 

ここで、@ hは文字列の時間部分であり、@ mは文字列の分部分です。

編集:

より良い方法は次のとおりです。

SELECT CAST('2000-01-01 08:30:00' as datetime) - CAST('00:15' AS datetime)
54
Martin Booth

[〜#〜] dateadd [〜#〜] を使用し、負の期間を使用します。例えば.

DATEADD(minute, -15, '2000-01-01 08:30:00') 
4
Mitch Wheat

やってみました

SELECT DATEADD(mi, -15,'2000-01-01 08:30:00')

DATEDIFFは2つの日付の差です。

3
Adriaan Stander

私は同じことをしようとして、hours:minutes from datetime-私がやった方法は次のとおりです。

convert( varchar, cast((RouteMileage / @average_speed) as integer))+ ':' +  convert( varchar, cast((((RouteMileage / @average_speed) - cast((RouteMileage / @average_speed) as integer)) * 60) as integer)) As TravelTime,

dateadd( n, -60 * CAST( (RouteMileage / @average_speed) AS DECIMAL(7,2)), @entry_date) As DepartureTime 

出力:

DeliveryDate                TravelTime             DepartureTime
2012-06-02 12:00:00.000       25:49         2012-06-01 10:11:00.000
2
Eminem

[〜#〜] datepart [〜#〜] を使用して間隔を引き離し、 [〜#〜] dateadd [〜#〜] を使用して部分を減算します。

select dateadd(
     hh,
    -1 * datepart(hh, cast('1:15' as datetime)),
    dateadd(
        mi,
        -1 * datepart(mi, cast('1:15' as datetime)),
        '2000-01-01 08:30:00'))

または、最初に分に変換することもできます(ただし、OPはそうしませんが)。

declare @mins int
select @mins = datepart(mi, cast('1:15' as datetime)) + 60 * datepart(hh, cast('1:15' as datetime)) 
select dateadd(mi, -1 * @mins, '2000-01-01 08:30:00')
1
Lachlan Roche