Подтвердить что ты не робот

Вычитание минуты из 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. Как я могу получить желаемый результат?

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

Edit:

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

4b9b3361

Ответ 1

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)

Ответ 2

Вы хотите использовать DATEADD, используя отрицательную продолжительность. например.

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

Ответ 3

Вы пробовали

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

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

Ответ 4

Используйте 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')

Ответ 5

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