Вычтите минуту из DateTime в SQL Server 2005 - PullRequest
32 голосов
/ 22 февраля 2010

Предположим, у меня есть поле даты и времени, значение которого 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 минут. Все в порядке. Любой другой способ без преобразования в минуты?

Ответы [ 5 ]

52 голосов
/ 22 февраля 2010
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)
4 голосов
/ 22 февраля 2010

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

DATEADD(minute, -15, '2000-01-01 08:30:00') 
3 голосов
/ 22 февраля 2010

Вы пробовали

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

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

2 голосов
/ 12 сентября 2012

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

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