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?

Author: davmos, 2010-02-22

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)
 50
Author: Martin Booth,
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') 
 4
Author: Mitch Wheat,
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.

 3
Author: Adriaan Stander,
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')
 1
Author: Lachlan Roche,
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
 1
Author: Eminem,
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