Restar minutos de DateTime en SQL Server 2005
Supongamos que tengo un campo datetime, cuyo valor es 2000-01-01 08:30:00 y un campo de duración cuyo valor es decir 00:15 (significado 15 minutos)
Si resto estos dos, debería obtener 2000-01-01 08:15:00
También si quiero restar 1:15 (significa 1 hora y 15 minutos), la salida debe ser 2000-01-01 07:15:00
Estoy tratando SELECT DATEDIFF(minute, '00:15','2000-01-01 08:30:00');
Pero la salida es 52595055. ¿Cómo puedo obtener el resultado deseado?
N.b.~ Si Hago SELECT dateadd(minute, -15,'2000-01-01 08:30:00');
, obtendré el resultado deseado, pero eso implica analizar el campo de minutos.
Editar:
Según las respuestas, cada uno está sugiriendo convertir todo en minutos y luego restar - así que si es 1:30, necesito restar 90 minutos. Eso está bien. ¿Alguna otra forma sin convertir a minutos?
5 answers
SELECT DATEADD(minute, -15, '2000-01-01 08:30:00');
El segundo valor (-15 en este caso) debe ser numérico (es decir, no una cadena como '00:15'). Si necesita restar horas y minutos, le recomendaría dividir la cadena en: para obtener las horas y minutos y restar usando algo como
SELECT DATEADD(minute, -60 * @h - @m, '2000-01-01 08:30:00');
Donde @h es la parte hora de tu cadena y @m es la parte minuto de tu cadena
EDITAR:
Aquí hay una mejor manera:
SELECT CAST('2000-01-01 08:30:00' as datetime) - CAST('00:15' AS datetime)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-02-22 05:48:52
Desea utilizar DATEADD, utilizando una duración negativa. por ejemplo,
DATEADD(minute, -15, '2000-01-01 08:30:00')
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-02-22 05:38:18
¿has probado
SELECT DATEADD(mi, -15,'2000-01-01 08:30:00')
DATEDIFF es la diferencia entre 2 fechas.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-02-22 05:39:15
Use DATEPART para separar su intervalo, y DATEADD para restar las partes:
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'))
O, podemos convertir a minutos primero (aunque OP preferiría no hacerlo):
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')
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-02-22 05:56:50
Pasé un tiempo tratando de hacer lo mismo, tratando de restar el hours:minutes
de datetime
- así es como lo hice:
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
SALIDA:
DeliveryDate TravelTime DepartureTime
2012-06-02 12:00:00.000 25:49 2012-06-01 10:11:00.000
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-09-25 16:12:36