Cómo convertir la columna de marca de tiempo de SQL Server al formato de fecha y hora

Como SQL Server devuelve la marca de tiempo como 'Nov 14 2011 03:12:12:947PM' , ¿hay alguna manera fácil de convertir el formato de cadena a fecha como ‘Ymd H: i: s’.

Hasta ahora yo uso

 date('Ymd H:i:s',strtotime('Nov 14 2011 03:12:12:947PM')) 

¡El tipo de datos TIMESTAMP SQL Server no tiene nada que ver con una fecha y hora!

Es solo una representación binaria de un número consecutivo: solo es bueno para asegurarse de que una fila no haya cambiado desde que se leyó.

En las versiones más nuevas de SQL Server, se llama RowVersion , ya que eso es realmente lo que es. Consulte los documentos de MSDN en ROWVERSION :

Es un tipo de datos que expone números binarios únicos generados automáticamente dentro de una base de datos. rowversion generalmente se usa como un mecanismo para las filas de la tabla de estampado de versiones. El tipo de datos rowversion es solo un número creciente y no conserva una fecha o una hora . Para registrar una fecha u hora, use un tipo de datos datetime2.

Por lo tanto, no puede convertir un TIMESTAMP SQL Server en una fecha / hora, simplemente no es una fecha / hora.

Pero si está diciendo timestamp pero realmente quiere decir una columna DATETIME , puede usar cualquiera de esos formatos de fecha válidos descritos en el tema CAST y CONVERT en la ayuda de MSDN. Esos están definidos y soportados “fuera de la caja” por SQL Server. Cualquier otra cosa no es compatible, por ejemplo, tiene que hacer una gran cantidad de fundición manual y concatenación (no recomendado).

El formato que está buscando se parece un poco al canonical de ODBC (estilo = 121):

 DECLARE @today DATETIME = SYSDATETIME() SELECT CONVERT(VARCHAR(50), @today, 121) 

da:

 2011-11-14 10:29:00.470 

SQL Server 2012 finalmente tendrá una función de FORMAT para hacer un formateo personalizado ……

Usando el reparto puede obtener la fecha de un campo de marca de tiempo:

 SELECT CAST(timestamp_field AS DATE) FROM tbl_name 

La forma más simple de hacer esto es:

 SELECT id,name,FROM_UNIXTIME(registration_date) FROM `tbl_registration`; 

Esto le da a la columna de fecha al menos un formato legible. Además, si desea cambiar el formato, haga clic aquí .

Mis compañeros de trabajo me ayudaron con esto:

 select CONVERT(VARCHAR(10), , 112), count(*) from table where  > '2012-09-10' group by CONVERT(VARCHAR(10), , 112); 

o

 select CONVERT(DATE, , 112), count(*) from table where  > '2012-09-10' group by CONVERT(DATE, , 112); 

Funciona bien, excepto este mensaje:

La conversión implícita del tipo de datos varchar a timestamp no está permitida. Use la función CONVERTIR para ejecutar esta consulta

Así que sí, TIMESTAMP (RowVersion) NO es una FECHA 🙂

Para ser honesto, me puse a pensar un buen rato para encontrar la manera de convertirlo en una cita.

La mejor forma es convertirlo a INT y comparar. Eso es lo que debe ser este tipo. Si desea una fecha, simplemente agregue una fila de fecha y hora y viva feliz para siempre 🙂

Cheers mac

Algunos de ellos realmente se convierten a una fecha y hora desde SQL Server 2008 en adelante.

Pruebe la siguiente consulta SQL y lo verá por usted mismo:

 SELECT CAST (0x00009CEF00A25634 AS datetime) 

Lo anterior resultará en 2009-12-30 09:51:03:000 pero he encontrado algunos que en realidad no se asignan a una fecha y hora.

¿Por qué no probar FROM_UNIXTIME(unix_timestamp, format) ?

“Sigues usando esa palabra. No creo que signifique lo que piensas que significa”. – Inigo Montoya

La marca de tiempo no tiene ninguna relación con el tiempo, como originalmente dijo marc_s.

 declare @Test table ( TestId int identity(1,1) primary key clustered ,Ts timestamp ,CurrentDt datetime default getdate() ,Something varchar(max) ) insert into @Test (Something) select name from sys.tables waitfor delay '00:00:10' insert into @Test (Something) select name from sys.tables select * from @Test 

Observe en la salida que Ts (hex) se incrementa en uno para cada registro, pero el tiempo real tiene un espacio de 10 segundos. Si estuviera relacionado con el tiempo, entonces habría un espacio en la marca de tiempo para corresponderse con la diferencia en el tiempo.

No estoy seguro de si me falta algo aquí, pero ¿no puedes simplemente convertir la marca de tiempo de esta manera?

 CONVERT(VARCHAR,CAST(ZEIT AS DATETIME), 110)