¿Cómo calcular la diferencia en horas (decimal) entre dos fechas en SQL Server?


Tengo que calcular la diferencia en horas (tipo decimal) entre dos fechas en SQL Server 2008.

No pude encontrar ninguna técnica útil para convertir datetime a decimal con 'CONVERT' en MSDN.
¿alguien Puede ayudarme con eso?

ACTUALIZACIÓN:
Para ser claro, necesito la parte fraccionaria también (por lo tanto tipo decimal). Así que de 9:00 a 10: 30 debería devolverme 1.5.

Author: Marc, 2009-11-20

8 answers

DATEDIFF(hour, start_date, end_date) te dará el número de límites de horas cruzados entre start_date y end_date.

Si necesita el número de horas fraccionadas, puede usar DATEDIFF en una resolución más alta y dividir el resultado:

DATEDIFF(second, start_date, end_date) / 3600.0

La documentación para DATEDIFF está disponible en MSDN:

Http://msdn.microsoft.com/en-us/library/ms189794%28SQL.105%29.aspx

 127
Author: Phil Ross,
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
2015-07-15 23:03:15

Simplemente reste los dos valores datetime y multiplíquelos por 24:

  Select Cast((@DateTime2 - @DateTime1) as Float) * 24.0

Un script de prueba podría ser:

  Declare @Dt1 dateTime Set @Dt1 = '12 Jan 2009 11:34:12'
  Declare @Dt2 dateTime Set @Dt2 = getdate()

  Select Cast((@Dt2 - @Dt1) as Float) * 24.0

Esto funciona porque todos los datetimes se almacenan internamente como un par de enteros, el primer entero es el número de días desde el 1 de enero de 1900, y el segundo entero (que representa el tiempo) es el número de (1) garrapatas desde medianoche. (Para SmallDatetimes el entero de la porción de tiempo es el número de minutos desde la medianoche). Cualquier aritmética hecha en el values usa la porción de tiempo como una fracción de un día. 6am = 0.25, mediodía = 0.5, etc... Ver Enlace MSDN aquí para más detalles.

So Cast((@Dt2 - @Dt1) como Float) te da un total de días entre dos datetimes. Multiplicar por 24 para convertir a horas. Si necesita un total de minutos, Multiplique por minutos por día (24 * 60 = 1440) en lugar de 24...

NOTA 1: Esto no es lo mismo que un tick dotNet o JavaScript - este tick es de aproximadamente 3.33 milisegundos.

 13
Author: Charles Bretana,
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
2016-02-16 15:39:06

DATEDIFF pero tenga en cuenta que devuelve un entero, por lo que si necesita fracciones de horas use algo como esto: -

CAST(DATEDIFF(ss, startDate, endDate) AS decimal(precision, scale)) / 3600
 8
Author: AnthonyWJones,
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
2009-11-20 14:09:51

Probablemente esté buscando la función DATEDIFF.

DATEDIFF (datepart , startdate , enddate)

Donde el código podría verse así:

DATEDIFF (hh , startdate , enddate)

 0
Author: Vincent Ramdhanie,
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
2009-11-20 14:07:37
DATEDIFF(minute,startdate,enddate)/60.0)

O use esto para 2 decimales:

CAST(DATEDIFF(minute,startdate,enddate)/60.0 as decimal(18,2))
 0
Author: mind,
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
2017-11-29 09:49:18

Usando Postgres tuve problemas con DATEDIFF, pero tuve éxito con esto:

  DATE_PART('day',(delivery_time)::timestamp - (placed_time)::timestamp) * 24 + 
  DATE_PART('hour',(delivery_time)::timestamp - (placed_time)::timestamp) +
  DATE_PART('minute',(delivery_time)::timestamp - (placed_time)::timestamp) / 60

Que me dio una salida como"14.3"

 0
Author: Patrick Kearns,
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
2018-04-11 21:12:47
Declare @date1 datetime
Declare @date2 datetime

Set @date1 = '11/20/2009 11:00:00 AM'
Set @date2 = '11/20/2009 12:00:00 PM'

Select Cast(DateDiff(hh, @date1, @date2) as decimal(3,2)) as HoursApart

Resultado = 1.00

 -1
Author: kd7,
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
2009-11-20 14:05:51

SELECCIONE DATEDIFF (hh, firstDate, secondDate) FROM tableName DONDE ...

 -1
Author: LorettoDave,
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
2009-11-20 14:06:00