sql-server - sacar - operaciones con fechas sql
¿Cómo calcular la diferencia en horas(decimal) entre dos fechas en SQL Server? (8)
DATEDIFF, pero tenga en cuenta que devuelve un número entero, por lo que si necesita fracciones de horas, utilice algo como esto: -
CAST(DATEDIFF(ss, startDate, endDate) AS decimal(precision, scale)) / 3600
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 me puede ayudar con eso?
ACTUALIZAR:
Para ser claro, también necesito la parte fraccional (por lo tanto, tipo decimal). Entonces, de 9:00 a 10:30, debería devolverme 1.5.
Probablemente estés buscando la función DATEDIFF .
DATEDIFF (datepart, startdate, enddate)
Donde el código podría ser así:
DATEDIFF (hh, startdate, enddate)
SELECCIONAR DATEDIFF (hh, firstDate, secondDate) FROM tableName DONDE ...
Simplemente reste los dos valores de fecha y hora y multiplique 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 ) tics desde la 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 los valores usa la porción de tiempo como una fracción de un día. 6 am = 0.25, mediodía = 0.5, etc ... Vea el enlace de MSDN aquí para más detalles.
Así que Cast ((@ Dt2 - @ Dt1) como Float) le da un total de días entre dos fechas. Multiplique por 24 para convertir a horas. Si necesita minutos totales, Múltiples por minuto por día (24 * 60 = 1440) en lugar de 24 ...
NOTA 1 : Esto no es lo mismo que un tic de dotNet o javaScript; este tic es de aproximadamente 3,33 milisegundos.
Utilizando 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"
DATEDIFF(hour, start_date, end_date)
le dará la cantidad de horas límites cruzados entre start_date
y end_date
.
Si necesita el número de horas fraccionarias, puede usar DATEDIFF
a 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
DATEDIFF(minute,startdate,enddate)/60.0)
O usa esto por 2 decimales:
CAST(DATEDIFF(minute,startdate,enddate)/60.0 as decimal(18,2))
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