So konvertieren Sie die Zeitstempelspalte von SQL Server in das Datum / Uhrzeit-Format


87

Da SQL Server einen Zeitstempel wie zurückgibt 'Nov 14 2011 03:12:12:947PM', gibt es eine einfache Möglichkeit, Zeichenfolgen in ein Datumsformat wie 'Ymd H: i: s' zu konvertieren.

Soweit benutze ich

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

Antworten:


244

Der TIMESTAMPDatentyp von SQL Server hat nichts mit Datum und Uhrzeit zu tun!

Es ist nur eine hexadezimale Darstellung einer aufeinanderfolgenden 8-Byte-Ganzzahl - es ist nur gut, um sicherzustellen, dass sich eine Zeile seit dem Lesen nicht geändert hat.

Sie können die hexadezimale Ganzzahl ablesen oder wenn Sie eine möchten BIGINT. Als Beispiel:

SELECT CAST (0x0000000017E30D64 AS BIGINT)

Das Ergebnis ist

400756068

In neueren Versionen von SQL Server wird es aufgerufen RowVersion- da es wirklich so ist. Siehe die MSDN-Dokumente zu ROWVERSION :

Ist ein Datentyp, der automatisch generierte, eindeutige Binärzahlen in einer Datenbank verfügbar macht. Die Zeilenversion wird im Allgemeinen als Mechanismus zum Versionsstempeln von Tabellenzeilen verwendet. Der Zeilenversionsdatentyp ist nur eine inkrementelle Zahl und behält weder ein Datum noch eine Uhrzeit bei . Verwenden Sie zum Aufzeichnen eines Datums oder einer Uhrzeit einen Datetime2-Datentyp.

Sie können einen SQL Server also nicht TIMESTAMPin ein Datum / eine Uhrzeit konvertieren - es ist einfach kein Datum / keine Uhrzeit.

Wenn Sie jedoch Zeitstempel sagen, aber wirklich eine DATETIMESpalte meinen , können Sie eines der gültigen Datumsformate verwenden, die im Thema CAST und CONVERT in der MSDN-Hilfe beschrieben sind. Diese werden von SQL Server "out of the box" definiert und unterstützt. Alles andere wird nicht unterstützt, z. B. müssen Sie viel manuell gießen und verketten (nicht empfohlen).

Das Format, nach dem Sie suchen, ähnelt ein bisschen dem ODBC-Kanon (style = 121):

DECLARE @today DATETIME = SYSDATETIME()

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

gibt:

2011-11-14 10:29:00.470

SQL Server 2012 wird endlich eine FORMATFunktion zum benutzerdefinierten Formatieren haben ......


3
Wahrscheinlich mein größter Ärger mit SQL Server. Warum nenne ich es einen Zeitstempel, wenn ich die Zeit damit nicht sagen kann?
BelgoCanadian

1
@ BelgoCanadian: Fragen Sie Sybase - das ist eine Funktion, die schon immer in Sybase / SQL Server vorhanden war .....
marc_s

1
@ BelgoCanadian Sie sollten froh sein zu wissen, dass es jetzt Rowversion docs.microsoft.com/en-us/sql/t-sql/data-types/… heißt
Jason S

es gibt TIMESTAMPTyp Spalten
Ghilteras

5

Der einfachste Weg, dies zu tun, ist:

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

Dies gibt die Datumsspalte mindestens in einem lesbaren Format. Wenn Sie das Format ändern möchten, klicken Sie hier .


11
Die Frage ist SQLServer, nicht MySQL
Mike M

5

Mit cast können Sie das Datum aus einem Zeitstempelfeld abrufen:

SELECT CAST(timestamp_field AS DATE) FROM tbl_name

18
Dies scheint nicht zu funktionieren:Explicit conversion from data type timestamp to date is not allowed.
Jocull

Schlechte Idee. Das Zeitstempelfeld ist nur eine Sequenz. Sie könnten Glück haben und ein Datum bekommen, aber das Datum hat keine Bedeutung. Sie sollten in BIGINT umwandeln, wenn Sie eine Dezimalzahl anstelle von Hex möchten. Der Zeitstempel heißt jetzt rowversion docs.microsoft.com/en-us/sql/t-sql/data-types/…
Jason S

3

Meine Mitarbeiter haben mir dabei geholfen:

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

oder

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

3

Funktioniert gut, außer dieser Nachricht:

Eine implizite Konvertierung vom Datentyp varchar in einen Zeitstempel ist nicht zulässig. Verwenden Sie die CONVERT-Funktion, um diese Abfrage auszuführen

Also ja, TIMESTAMP( RowVersion) ist KEIN DATUM :)

Um ehrlich zu sein, habe ich einige Zeit selbst herumgespielt, um einen Weg zu finden, es in ein Datum umzuwandeln.

Der beste Weg ist, es zu konvertieren INTund zu vergleichen. So soll dieser Typ sein.

Wenn du ein Date haben willst - füge einfach eine DatetimeSpalte hinzu und lebe glücklich bis ans Ende :)

Prost Mac


1
Oder BIGINT, da es 8 Bytes sind
Jason S

2

"Du benutzt dieses Wort weiter. Ich glaube nicht, dass es bedeutet, was du denkst, dass es bedeutet." - Inigo Montoya

Der Zeitstempel hat absolut keine Beziehung zur Zeit, wie marc_s ursprünglich sagte.

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

Beachten Sie in der Ausgabe, dass Ts (hex) für jeden Datensatz um eins erhöht wird, die tatsächliche Zeit jedoch eine Lücke von 10 Sekunden aufweist. Wenn es sich auf die Zeit beziehen würde, würde es eine Lücke im Zeitstempel geben, die der Zeitdifferenz entspricht.


0

Nach der Beschleunigung der Konvertierung in eine Ganzzahl CONVERT (BIGINT, [Zeitstempel]) als Zeitstempel habe ich das Ergebnis wie folgt

446701117 446701118 446701119 446701120 446701121 446701122 446701123 446701124 446701125 446701126

Ja, dies ist kein Datum und keine Uhrzeit. Es sind Seriennummern


0

für mich funktioniert: TO_DATE ('19700101', 'yyyymmdd') + (TIME / 24/60/60) (oracle DB)


0

Ich hatte das gleiche Problem mit dem Zeitstempel, z. B.: '29 -JUL-20 04.46.42.000000000 PM '. Ich wollte es in das Format 'JJJJ-MM-TT' verwandeln. Die Lösung, die endlich für mich funktioniert, ist

SELECT TO_CHAR (mytimestamp, 'JJJJ-MM-TT') FROM mytable;


-1

Einige von ihnen sind ab SQL Server 2008 tatsächlich auf ein Datum und eine Uhrzeit verdeckt .

Probieren Sie die folgende SQL-Abfrage aus und Sie werden es selbst sehen:

SELECT CAST (0x00009CEF00A25634 AS datetime)

Das Obige führt dazu, 2009-12-30 09:51:03:000aber ich bin auf solche gestoßen, die eigentlich keiner Datums- und Uhrzeitzuordnung zugeordnet sind.


1
Tu das nicht. Sie könnten Glück haben und eine Konvertierung erhalten, aber die Datums- und Uhrzeitangabe ist bedeutungslos und irreführend. Der Zeitstempel ist nur eine Sequenznummer und heißt jetzt Zeilenversion docs.microsoft.com/en-us/sql/t-sql/data-types/… . Wenn Sie eine Dezimalzahl möchten, geben Sie diese einfach in BIGINT
Jason S


-3

Ich bin mir nicht sicher, ob mir hier etwas fehlt, aber können Sie den Zeitstempel nicht einfach so konvertieren:

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

Hast du das versucht? TIMESTAMP hat keine Beziehung zu DATE.
Sean Pearce

Ich benutze es auf SQL Server 2008
Daniel

Versuchen Sie auch hier nicht, auf datetime zu übertragen. Es ist einfach eine ganzzahlige Folge in hexadezimaler Form. Einfach auf BIGINT werfen.
Jason S
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.