So konvertieren Sie eine Datums- / Uhrzeitangabe in eine Zeichenfolge in T-SQL


88

Ich bin überrascht, diese Frage hier noch nicht finden zu können.

Ich habe eine Datums- / Uhrzeitvariable und möchte sie in eine Zeichenfolge konvertieren, damit ich sie an eine andere Zeichenfolge anhängen kann. Ich möchte es in einem Format, das einfach wieder in eine Datums- und Uhrzeitangabe konvertiert werden kann.

Wie kann ich das machen?

(Ich möchte den Datumsteil und den Zeitteil.)


@ TonyHopkinson Ich habe auch viele Hits bekommen, aber sie schienen alle in die andere Richtung zu konvertieren. Oder etwas Komplizierteres wollen.
Cja

3
Geben Sie ein Convert, doppelklicken Sie, um hervorzuheben, drücken Sie Umschalt + F1 ... immer die erste Verteidigungslinie.
Eric J. Price

Antworten:


152

Die folgende Abfrage ruft die aktuelle Datums- und Uhrzeitangabe ab und konvertiert sie in eine Zeichenfolge. mit dem folgenden Format
yyyy-mm-dd hh:mm:ss(24h)

SELECT convert(varchar(25), getdate(), 120) 

45
Ich kann immer noch nicht darüber
hinwegkommen

4
@cja Ich teile total deine Überraschung. Ich möchte eine Zeichenfolge wie yyddss bereitstellen , um genau das gewünschte Format zu erhalten. Es gibt wahrscheinlich einen technischen oder historischen Grund dafür. Aber trotzdem - sehr überraschend.
Konrad Viltersten

2
Vielen Dank für die schnelle Lösung, aber in Ihrer Antwort codieren Sie die Monate als Minuten, JJJJ-MM-TT HH: MM: SS NICHT JJJJ-MM-TT HH: MM: SS
Tom Martin

Obwohl das alt ist, bin ich gerade auf diesen Thread gestoßen. Stellen Sie bei der Verwendung DateTimeOffSetsicher, dass Sie die varcharLänge so anpassen , wie Ihr Ergebnis aussehen soll. Für mich wollte ich nicht die Zeitzone, also musste ich verwendenSELECT convert(varchar(19), sysdatetimeoffset(), 120)
RoLYroLLs


7

Mit der convertAnweisung in Microsoft SQL Server können Sie ein Datum in eine Zeichenfolge konvertieren. Ein Beispiel für die verwendete Syntax wäre:

SELECT convert(varchar(20), getdate(), 120)

Das obige würde das aktuelle Datum und die aktuelle Uhrzeit in einer Zeichenfolge mit dem Format YYYY-MM-DD HH:MM:SSim 24-Stunden- Format zurückgeben .

Sie können die Zahl am Ende der Anweisung in eine von vielen ändern, wodurch das zurückgegebene Zeichenfolgenformat geändert wird. Eine Liste dieser Codes finden Sie auf der MSDN im Referenzabschnitt CAST und CONVERT .


5

Es gibt 3 verschiedene Methoden, je nachdem, was ich benötige und welche Version ich verwende.

Hier sind die Methoden ..

1) Verwenden von Konvertieren

DECLARE @DateTime DATETIME = GETDATE();
--Using Convert
SELECT
    CONVERT(NVARCHAR, @DateTime,120) AS 'myDateTime'
    ,CONVERT(NVARCHAR(10), @DateTime, 120) AS 'myDate'
    ,RIGHT(CONVERT(NVARCHAR, @DateTime, 120),8) AS 'myTime'

2) Verwenden von Cast (SQL Server 2008 und höher)

SELECT
    CAST(@DateTime AS DATETIME2) AS 'myDateTime'
    ,CAST(@DateTime AS DATETIME2(3)) AS 'myDateTimeWithPrecision'
    ,CAST(@DateTime AS DATE) AS 'myDate'
    ,CAST(@DateTime AS TIME) AS 'myTime'
    ,CAST(@DateTime AS TIME(3)) AS 'myTimeWithPrecision'

3) Verwenden des Zeichendatentyps mit fester Länge

DECLARE @myDateTime NVARCHAR(20) = CONVERT(NVARCHAR, @DateTime, 120);
DECLARE @myDate NVARCHAR(10) = CONVERT(NVARCHAR, @DateTime, 120);

SELECT
    @myDateTime AS 'myDateTime'
    ,@myDate AS 'myDate'

4

Wenn Sie SQL Server 2012 und höher verwenden, verwenden Sie zusätzlich zu den Funktionen CASTund CONVERTin den vorherigen Antworten die Funktion FORMAT , um einen DATETIMEbasierten Typ in eine Zeichenfolge zu konvertieren .

Verwenden Sie zum Zurückkonvertieren das Gegenteil PARSEoder die TRYPARSEFunktionen.

Die Formatierungsstile basieren auf .NET (ähnlich den Zeichenfolgenformatierungsoptionen der ToString () -Methode) und haben den Vorteil, dass sie kulturbewusst sind. z.B.

DECLARE @DateTime DATETIME2 = SYSDATETIME();
DECLARE @StringResult1 NVARCHAR(100) = FORMAT(@DateTime, 'g') --without culture
DECLARE @StringResult2 NVARCHAR(100) = FORMAT(@DateTime, 'g', 'en-gb') 
SELECT @DateTime
SELECT @StringResult1, @StringResult2
SELECT PARSE(@StringResult1 AS DATETIME2)
SELECT PARSE(@StringResult2 AS DATETIME2 USING 'en-gb')

Ergebnisse:

2015-06-17 06:20:09.1320951
6/17/2015 6:20 AM
17/06/2015 06:20
2015-06-17 06:20:00.0000000
2015-06-17 06:20:00.0000000

Fehlt mir etwas oder ist das OP-Problem mit FORMAT (<date var>, 'tt MMMM yyyy HH: mm: ss') oder einem beliebigen benutzerdefinierten Datumsformat gelöst?!
Grimmig

@Grim das kannst du auch. Aus den DokumentenThe format argument must contain a valid .NET Framework format string, either as a standard format string (for example, "C" or "D"), or as a pattern of custom characters for dates and numeric values (for example, "MMMM DD, yyyy (dddd)")
g2server

Ich denke, Sie arbeiten hier tatsächlich zu hart. SQL Server verfügt über implizite Zeichenfolgenäquivalente für DATETIME2. Was Sie hier tatsächlich tun, ist, die implizite Konvertierung zu verwenden und dann die resultierende Zeichenfolge zu formatieren, nicht die Datums- / Uhrzeitangabe.
Jamie Marshall

@ JamieMarshall mehr oder weniger. MSDN schlägt vor:Use the FORMAT function for locale-aware formatting of date/time and number values as strings. For general data type conversions, use CAST or CONVERT.
g2server


1
SELECT CONVERT(varchar, @datetime, 103) --for UK Date format 'DD/MM/YYYY'

101 - US - MM / TT / JJJJ

108 - Zeit - HH: MI: SS

112 - Datum - JJJJMMTT

121 - ODBC - JJJJ-MM-TT HH: MI: SS.FFF

20 - ODBC - JJJJ-MM-TT HH: MI: SS


1

Dies wurde von vielen Leuten beantwortet, aber ich denke, die einfachste Lösung wurde ausgelassen.

SQL SERVER (ich glaube, es ist 2012+) hat implizite Zeichenfolgenäquivalente für DATETIME2, wie hier gezeigt

Lesen Sie den Abschnitt "Unterstützte String-Literalformate für datetime2".

Um die OP-Frage explizit zu beantworten:

DECLARE @myVar NCHAR(32)
DECLARE @myDt DATETIME2
SELECT @myVar = @GETDATE()
SELECT @myDt = @myVar
PRINT(@myVar)
PRINT(@myDt)

Ausgabe:

Jan 23 2019 12:24PM             
2019-01-23 12:24:00.0000000

Hinweis: Die erste Variable ( myVar) enthält tatsächlich auch den Wert '2019-01-23 12:24:00.0000000'. Es wird nur Jan 23 2019 12:24PMaufgrund der für SQL Server festgelegten Standardformatierung formatiert, die bei Verwendung aufgerufen wird PRINT. Lass dich hier nicht davon stolpern, der eigentliche String in (myVer)='2019-01-23 12:24:00.0000000'


0

Versuchen Sie es unten:

DECLARE @myDateTime DATETIME
SET @myDateTime = '2013-02-02'

-- Convert to string now
SELECT LEFT(CONVERT(VARCHAR, @myDateTime, 120), 10)

1
Gut !! Müssen wir auch LINKS schreiben?
Gaurav123

Nimmt 10 erste Zeichen, also wenn Sie es brauchen, wenn Sie nur das Datum wollen.
Ram4nd
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.