web-dev-qa-db-fra.com

Comment convertir une colonne d'horodatage SQL Server au format datetime

Lorsque SQL Server renvoie l'horodatage tel que 'Nov 14 2011 03:12:12:947PM', existe-t-il un moyen simple de convertir une chaîne au format de date tel que 'Y-m-d H: i: s'.

Jusqu'ici j'utilise

date('Y-m-d H:i:s',strtotime('Nov 14 2011 03:12:12:947PM'))
75
Jayson

Le type de données TIMESTAMP de SQL Server n'a rien à faire avec une date et une heure!

Il ne s'agit que d'une représentation hexadécimale d'un nombre entier consécutif de 8 octets. Elle permet uniquement de s'assurer qu'une ligne ne change pas depuis sa lecture.

Vous pouvez lire le nombre entier hexadécimal ou si vous voulez un BIGINT. Par exemple:

SELECT CAST (0x0000000017E30D64 AS BIGINT)

Le résultat est

400756068

Dans les versions plus récentes de SQL Server, cela s'appelle RowVersion - car c'est vraiment ce que c'est. Voir le documentation MSDN sur ROWVERSION :

Est un type de données qui expose des nombres binaires uniques générés automatiquement dans une base de données. rowversion est généralement utilisé comme mécanisme pour l'estampillage de version des lignes d'un tableau. Le type de données rowversion est juste un nombre incrémentant et ne conserve pas une date ni une heure . Pour enregistrer une date ou une heure, utilisez un type de données datetime2.

Ainsi, vous ne pouvez pas convertir un serveur SQL Server TIMESTAMP en une date/heure - ce n'est tout simplement pas une date/heure.

Toutefois, si vous parlez d'horodatage mais que vous parlez en réalité d'une colonne DATETIME, vous pouvez utiliser l'un des formats de date valides décrits dans la rubrique CAST and CONVERT de l'aide de MSDN. Celles-ci sont définies et prises en charge "prêtes à l'emploi" par SQL Server. Tout le reste n'est pas pris en charge, par exemple vous devez faire beaucoup de castings et de concaténations manuelles (non recommandé).

Le format que vous recherchez ressemble un peu au ODBC canonique (style = 121):

DECLARE @today DATETIME = SYSDATETIME()

SELECT CONVERT(VARCHAR(50), @today, 121)

donne:

2011-11-14 10:29:00.470

SQL Server 2012 aura enfin une fonction FORMAT pour faire un formatage personnalisé ......

224
marc_s

En utilisant le casting, vous pouvez obtenir la date d'un champ d'horodatage:

SELECT CAST(timestamp_field AS DATE) FROM tbl_name
5
Ali

Fonctionne bien, sauf ce message:

La conversion implicite du type de données varchar en horodatage n'est pas autorisée. Utilisez la fonction CONVERT pour exécuter cette requête

Donc oui, TIMESTAMP (RowVersion) est PAS une DATE :)

Pour être honnête, je me suis débrouillé assez longtemps pour trouver un moyen de le convertir en rendez-vous.

Le meilleur moyen est de le convertir en INT et de le comparer. C'est ce que ce type est censé être.

Si vous voulez une date - ajoutez simplement une colonne Datetime et vivez heureux pour toujours :)

acclamations mac

3
Mac

Mes collègues m'ont aidé avec ceci:

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

ou

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

"Vous continuez à utiliser cette Parole. Je ne pense pas que cela signifie ce que vous pensez que cela signifie." - Inigo Montoya

L'horodatage n'a absolument aucun rapport avec le temps, comme le disait initialement 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

Notez dans la sortie que Ts (hex) incrémente d'une unité pour chaque enregistrement, mais que le temps réel a un intervalle de 10 secondes. Si cela était lié au temps, il y aurait un intervalle dans l'horodatage correspondant à la différence de temps.

2
user432532

Le moyen le plus simple de le faire est:

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

Cela donne au moins la colonne de date dans un format lisible. De plus, si vous voulez changer le format, cliquez ici .

1
Sudeep nayak

Certains d'entre eux se convertissent en fait à une date/heure à partir de SQL Server 2008.

Essayez la requête SQL suivante et vous verrez par vous-même:

SELECT CAST (0x00009CEF00A25634 AS datetime)

Ce qui précède entraînera 2009-12-30 09:51:03:000 mais j'ai rencontré des problèmes qui ne correspondent pas à une date/heure.

0
ambodi

Pourquoi ne pas essayer FROM_UNIXTIME(unix_timestamp, format)?

0
user3541554