2009-06-15 4 views
13

Beide Abfragen übersetzt unten auf die gleiche AnzahlWie konvertiert man DateTime in eine Zahl mit einer Genauigkeit größer als Tage in 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) 

Ergebnis

39978 
39978 

Die erzeugte Zahl wird anders sein, nur wenn die Tage sind unterschiedlich. Gibt es eine Möglichkeit, die DateTime in eine präzisere Zahl zu konvertieren, wie in .NET mit der .Ticks-Eigenschaft?

Ich brauche mindestens eine Minute Präzision.

Antwort

22

Nun, würde ich es tun, wie folgt:

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

wo ‚1990.01.01‘ ist eine beliebige Basis Datetime.

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

ergibt 39977,9590277778

0

CAST mit einem Schwimmer oder dezimale anstelle eines int/Bigint.

Der ganzzahlige Teil (vor dem Dezimalpunkt) steht für die Anzahl ganzer Tage. Nach der Dezimalzahl sind die gebrochenen Tage (d. H. Die Zeit).

0

Sie können mit T-SQL, das Datum konvertieren, bevor es zu einem .NET Programm bekommt. Dies ist oft einfacher, wenn Sie in Ihrem .NET-Programm keine zusätzliche Datumsumwandlung durchführen müssen.

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

Diese Lösung ist die eleganteste für mich. Ich bin auf SQL Server 2012 –

1

Wenn der Zweck ist, einen eindeutigen Wert aus dem date, hier zu schaffen, ist das, was ich tun würde

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

Hier werden das Datum wird und erklärt, es als ein einfacher Zeitstempel

+0

Und hier ist eine Bigint-Version des gleichen – Stan

0

Und h Es ist eine Bigint-Version der gleichen

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