Вычесть минуту из 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')
использовать 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