2009-06-15 16 views
13

dos consultas siguientes se traduce en el mismo número¿Cómo convertir DateTime a un número con una precisión superior a días en T-SQL?

SELECT CONVERT(bigint,CONVERT(datetime,'2009-06-15 15:00:00')) 
SELECT CAST(CONVERT(datetime,'2009-06-15 23:01:00') as bigint) 

Resultado

39978 
39978 

El número generado será diferente sólo si los días son diferentes. ¿Hay alguna manera de convertir el DateTime a un número más preciso, como lo hacemos en .NET con la propiedad .Ticks?

Necesito por lo menos un minuto de precisión.

Respuesta

22

Bueno, lo haría así:

select datediff(minute,'1990-1-1',datetime) 

donde '01/01/1990' es una fecha y hora de base arbitraria.

7
SELECT CAST(CONVERT(datetime,'2009-06-15 23:01:00') as float) 

produce 39977,9590277778

0

CAST para un flotador o decimal en lugar de un int/bigint.

La parte entera (antes del punto decimal) representa el número de días completos. Después del decimal son los días fraccionarios (es decir, el tiempo).

0

Puede utilizar T-SQL para convertir la fecha antes de que llegue a su programa .NET. Esto a menudo es más simple si no necesita hacer una conversión de fecha adicional en su programa .NET.

DECLARE @Date DATETIME = Getdate() 
DECLARE @DateInt INT = CONVERT(VARCHAR(30), @Date, 112) 
DECLARE @TimeInt INT = REPLACE(CONVERT(VARCHAR(30), @Date, 108), ':', '') 
DECLARE @DateTimeInt BIGINT = CONVERT(VARCHAR(30), @Date, 112) + REPLACE(CONVERT(VARCHAR(30), @Date, 108), ':', '') 
SELECT @Date as Date, @DateInt DateInt, @TimeInt TimeInt, @DateTimeInt DateTimeInt 

Date     DateInt  TimeInt  DateTimeInt 
------------------------- ----------- ----------- -------------------- 
2013-01-07 15:08:21.680 20130107 150821  20130107150821 
2
DECLARE @baseTicks AS BIGINT; 
SET @baseTicks = 599266080000000000; --# ticks up to 1900-01-01 

DECLARE @ticksPerDay AS BIGINT; 
SET @ticksPerDay = 864000000000; 

SELECT CAST(@baseTicks + (@ticksPerDay * CAST(GETDATE() AS FLOAT)) AS BIGINT) AS currentDateTicks; 
+0

Esta solución es la más elegante para mí. Estoy en SQL Server 2012 –

1

Si el propósito de esto es crear un valor único de la date, aquí es lo que haría

DECLARE @ts TIMESTAMP 
SET @ts = CAST(getdate() AS TIMESTAMP) 
SELECT @ts 

Esto pone la fecha y declara como una simple marca de tiempo

+0

Y aquí hay una versión en letra grande de la misma – Stan

0

Y h ERE es una versión de la misma bigint

DECLARE @ts BIGINT 
SET @ts = CAST(CAST(getdate() AS TIMESTAMP) AS BIGINT) 
SELECT @ts 
Cuestiones relacionadas