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