Antworten:
Der TIMESTAMP
Datentyp 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 TIMESTAMP
in ein Datum / eine Uhrzeit konvertieren - es ist einfach kein Datum / keine Uhrzeit.
Wenn Sie jedoch Zeitstempel sagen, aber wirklich eine DATETIME
Spalte 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 FORMAT
Funktion zum benutzerdefinierten Formatieren haben ......
TIMESTAMP
Typ Spalten
Mit cast können Sie das Datum aus einem Zeitstempelfeld abrufen:
SELECT CAST(timestamp_field AS DATE) FROM tbl_name
Explicit conversion from data type timestamp to date is not allowed.
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);
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 INT
und zu vergleichen. So soll dieser Typ sein.
Wenn du ein Date haben willst - füge einfach eine Datetime
Spalte hinzu und lebe glücklich bis ans Ende :)
Prost Mac
"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.
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
für mich funktioniert: TO_DATE ('19700101', 'yyyymmdd') + (TIME / 24/60/60) (oracle DB)
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:000
aber ich bin auf solche gestoßen, die eigentlich keiner Datums- und Uhrzeitzuordnung zugeordnet sind.
Warum nicht versuchen FROM_UNIXTIME(unix_timestamp, format)
?
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)