Вычесть минуту из DateTime в SQL Server 2005

Предположим, у меня есть поле datetime, значение которого составляет 2000-01-01 08:30:00 и поле длительности, значение которого сказать 00:15 (то есть 15 минут)

Если я вычитаю эти два, я должен получить 2000-01-01 08:15:00

также, если я хочу вычесть 1:15 (означает 1 час 15 минут), результат должен быть 2000-01-01 07:15:00

Я пытаюсь SELECT DATEDIFF(minute, '00:15','2000-01-01 08:30:00');

но выход 52595055. Как получить желаемый результат?

Н. Б.~ если я делаю SELECT dateadd(minute, -15,'2000-01-01 08:30:00');, Я получу желаемый результат, но это включает в себя разбор минутного поля.

Edit:

согласно ответам, каждый предлагает преобразовать все в минуты, а затем вычесть - поэтому, если это 1:30, мне нужно вычесть 90 минут. Все нормально. Любой другой способ без преобразования в минуты?

5 ответов


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

второе значение (-15 в этом случае) должно быть числовым (т. е. не строкой типа '00:15'). Если вам нужно вычесть часы и минуты, я бы рекомендовал разделить строку на : чтобы получить часы и минуты и вычесть, используя что-то вроде

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

где @h-часовая часть вашей строки, а @m-минутная часть вашей строки

EDIT:

вот лучший способ:

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

вы хотите использовать функция dateadd, используя отрицательные продолжительность. например,

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

ты пробовал

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

DATEDIFF-это разница между 2 датами.


использовать 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')

Я провел некоторое время, пытаясь сделать то же самое, пытаясь вычесть hours:minutes С 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