Предположим, что у меня есть поле даты и времени, значение которого 01.01.2000 8:30:00 и поле продолжительности, значение которого, говорит 0:15 (значение 15 минут)
Если я вычитаю эти два, я должен добраться 01.01.2000 8:15:00
Также, если я хочу вычесть 1:15 (означает 1 час 15 минут), вывод должен быть 01.01.2000 7: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');
, Я получу желаемый результат, но это включает парсинг мелкого поля.
Править:
Согласно ответам, все предлагают преобразовать все в минуты и затем вычесть - поэтому, если это - 1:30, я должен вычесть 90 минут. Это прекрасно. Какой-либо другой путь, не преобразовывая в минуты?
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 - минутная часть вашей строка
РЕДАКТИРОВАТЬ:
Вот способ лучше:
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 - это разница между двумя датами.
Используйте 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')