So konvertieren Sie DateTime in VarChar


303

Ich arbeite an einer Abfrage in SQL Server 2005, bei der ich einen Wert in DateTimeVariable in eine varcharVariable im yyyy-mm-ddFormat (ohne Zeitteil) konvertieren muss . Wie mache ich das?


1
CONVERTSiehe MSDN-Dokumentation .
Jason Cohen

3
Beachten Sie, dass JJJJ-MM-TT abhängig von Ihren Spracheinstellungen nicht eindeutig ist. Am besten verwenden Sie den ISO-Standard JJJJMMTT, siehe diesen Blog-Beitrag
Andy Irving

Antworten:


262

Mit Microsoft SQL Server:

--
-- Create test case
--
DECLARE @myDateTime DATETIME
SET @myDateTime = '2008-05-03'

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

12
Für diejenigen unter Ihnen, die interessiert sein könnten, wäre dies besser, wenn Sie VARCHAR in CHAR ändern. Weitere Informationen finden Sie in diesem Beitrag ( stackoverflow.com/questions/59667/… ). Im Wesentlichen sind in VARCHAR vs CHAR 2 Bytes Overhead involviert. In diesem Szenario wissen wir, dass Ihre Zeichenfolge immer aus 10 Zeichen besteht, daher ist CHAR angemessen.
Will Ediger

1
Nebenbei bemerkt, nach allem, was ich gesehen habe, schade, dass keines der Formate die DATEFORMAT-Werte berücksichtigt, vielleicht gibt es einen anderen Weg.
Alex Nolasco

3
Gibt es einen Grund, LEFT(.., 10)statt zu verwenden CONVERT(CHAR(10), ...)? Auch diejenigen, die mit den neueren Versionen von SQL Server als 2005 (!) Arbeiten, sollten die Antwort von Zar Shardan lesen, die eine FORMAT(date_value, format_string)funktionsbasierte Lösung vorschlägt .
Nickolay

@ Nickolay außerdem FORMAT()ist zu langsam relativ zuconvert(char(10),...)
abdul qayyum

380

Hier ist ein Test-SQL für alle Stile.

DECLARE @now datetime
SET @now = GETDATE()
select convert(nvarchar(MAX), @now, 0) as output, 0 as style 
union select convert(nvarchar(MAX), @now, 1), 1
union select convert(nvarchar(MAX), @now, 2), 2
union select convert(nvarchar(MAX), @now, 3), 3
union select convert(nvarchar(MAX), @now, 4), 4
union select convert(nvarchar(MAX), @now, 5), 5
union select convert(nvarchar(MAX), @now, 6), 6
union select convert(nvarchar(MAX), @now, 7), 7
union select convert(nvarchar(MAX), @now, 8), 8
union select convert(nvarchar(MAX), @now, 9), 9
union select convert(nvarchar(MAX), @now, 10), 10
union select convert(nvarchar(MAX), @now, 11), 11
union select convert(nvarchar(MAX), @now, 12), 12
union select convert(nvarchar(MAX), @now, 13), 13
union select convert(nvarchar(MAX), @now, 14), 14
--15 to 19 not valid
union select convert(nvarchar(MAX), @now, 20), 20
union select convert(nvarchar(MAX), @now, 21), 21
union select convert(nvarchar(MAX), @now, 22), 22
union select convert(nvarchar(MAX), @now, 23), 23
union select convert(nvarchar(MAX), @now, 24), 24
union select convert(nvarchar(MAX), @now, 25), 25
--26 to 99 not valid
union select convert(nvarchar(MAX), @now, 100), 100
union select convert(nvarchar(MAX), @now, 101), 101
union select convert(nvarchar(MAX), @now, 102), 102
union select convert(nvarchar(MAX), @now, 103), 103
union select convert(nvarchar(MAX), @now, 104), 104
union select convert(nvarchar(MAX), @now, 105), 105
union select convert(nvarchar(MAX), @now, 106), 106
union select convert(nvarchar(MAX), @now, 107), 107
union select convert(nvarchar(MAX), @now, 108), 108
union select convert(nvarchar(MAX), @now, 109), 109
union select convert(nvarchar(MAX), @now, 110), 110
union select convert(nvarchar(MAX), @now, 111), 111
union select convert(nvarchar(MAX), @now, 112), 112
union select convert(nvarchar(MAX), @now, 113), 113
union select convert(nvarchar(MAX), @now, 114), 114
union select convert(nvarchar(MAX), @now, 120), 120
union select convert(nvarchar(MAX), @now, 121), 121
--122 to 125 not valid
union select convert(nvarchar(MAX), @now, 126), 126
union select convert(nvarchar(MAX), @now, 127), 127
--128, 129 not valid
union select convert(nvarchar(MAX), @now, 130), 130
union select convert(nvarchar(MAX), @now, 131), 131
--132 not valid
order BY style

Hier ist das Ergebnis

output                   style
Apr 28 2014  9:31AM          0
04/28/14                     1
14.04.28                     2
28/04/14                     3
28.04.14                     4
28-04-14                     5
28 Apr 14                    6
Apr 28, 14                   7
09:31:28                     8
Apr 28 2014  9:31:28:580AM   9
04-28-14                     10
14/04/28                     11
140428                       12
28 Apr 2014 09:31:28:580     13
09:31:28:580                 14
2014-04-28 09:31:28          20
2014-04-28 09:31:28.580      21
04/28/14  9:31:28 AM         22
2014-04-28                   23
09:31:28                     24
2014-04-28 09:31:28.580      25
Apr 28 2014  9:31AM          100
04/28/2014                   101
2014.04.28                   102
28/04/2014                   103
28.04.2014                   104
28-04-2014                   105
28 Apr 2014                  106
Apr 28, 2014                 107
09:31:28                     108
Apr 28 2014  9:31:28:580AM   109
04-28-2014                   110
2014/04/28                   111
20140428                     112
28 Apr 2014 09:31:28:580     113
09:31:28:580                 114
2014-04-28 09:31:28          120
2014-04-28 09:31:28.580      121
2014-04-28T09:31:28.580      126
2014-04-28T09:31:28.580      127
28 جمادى الثانية 1435  9:31:28:580AM    130
28/06/1435  9:31:28:580AM    131

Machen nvarchar(max)kürzer die Zeit zu trimmen. Zum Beispiel:

select convert(nvarchar(11), GETDATE(), 0)
union select convert(nvarchar(max), GETDATE(), 0)

Ausgänge:

May 18 2018
May 18 2018  9:57AM

Hier wollen wir manchmal gerne dd-mmoder jun - 28. Gibt es eine Option?
Rock

Funktioniert für SQL Server 2005, daher ist dies ideal für diejenigen von uns, die sich leider immer noch in ältere Systeme einmischen. Bald auf 2014 upgraden, aufgeregt!
Legasthenikeraboko

Ich möchte ein Format nahe 101 - 101 = 28.04.2014 formatieren, ich möchte im Monat ohne Null sein, Ausgabe 28.04.2014, ist es anwendbar?
Ahmed Abdelqader

1
Fehlt

@Atishay "wird nur beim Umwandeln von Zeichendaten in datetime oder smalldatetime unterstützt". Siehe die Fußnoten 6 und 7 unter docs.microsoft.com/de-de/sql/t-sql/functions/…
Colin


38

SQL Server 2012 hat eine neue Funktion, FORMAT: http://msdn.microsoft.com/en-us/library/ee634924.aspx

und Sie können benutzerdefinierte Zeichenfolgen für das Datums- und Uhrzeitformat verwenden: http://msdn.microsoft.com/en-us/library/ee634398.aspx

Diese Seiten implizieren, dass es auch in SQL2008R2 verfügbar ist, aber ich habe keine zur Hand, um zu testen, ob dies der Fall ist.

Anwendungsbeispiel (australische Datums- und Uhrzeitangabe):

FORMAT(VALUE,'dd/MM/yyyy h:mm:ss tt')

9

Sie können verwenden DATEPART(DATEPART, VARIABLE). Zum Beispiel:

DECLARE @DAY INT 
DECLARE @MONTH INT
DECLARE @YEAR INT
DECLARE @DATE DATETIME
@DATE = GETDATE()
SELECT @DAY = DATEPART(DAY,@DATE)
SELECT @MONTH = DATEPART(MONTH,@DATE)
SELECT @YEAR = DATEPART(YEAR,@DATE)


6

- Dies gibt Ihnen die Zeit als 0 im Format 'JJJJ-MM-TT 00: 00: 00.000'.


SELECT CAST( CONVERT(VARCHAR, GETDATE(), 101) AS DATETIME) ; 

5

Mit Microsoft SQL Server:

Verwenden Sie die Syntax für CONVERT:

CONVERT ( data_type [ ( length ) ] , expression [ , style ] )

Beispiel:

SELECT CONVERT(varchar,d.dateValue,1-9)

Weitere Informationen zum Stil finden Sie hier: MSDN - Cast and Convert (Transact-SQL) .




3
declare @dt datetime

set @dt = getdate()

select convert(char(10),@dt,120) 

Ich habe eine feste Datenlänge von, char(10)wie Sie ein bestimmtes Zeichenfolgenformat wünschen.


2

Das OP erwähnte das Datum / Uhrzeit- Format. Für mich steht der Zeitteil im Weg.
Ich denke, es ist etwas sauberer, den Zeitanteil (durch Umwandeln von Datum und Uhrzeit) vor dem Formatieren zu entfernen.

convert( varchar(10), convert( date, @yourDate ) , 111 )


2

Sie können Ihr Datum in viele Formate konvertieren. Die Syntax ist einfach zu verwenden:

CONVERT('TheTypeYouWant', 'TheDateToConvert', 'TheCodeForFormating' * )
CONVERT(NVARCHAR(10), DATE_OF_DAY, 103) => 15/09/2016
  • Der Code ist eine Ganzzahl, hier ist 3 die dritte Formatierung ohne Jahrhundert. Wenn Sie möchten, dass das Jahrhundert geändert wird, ändern Sie den Code einfach in 103.

In Ihrem Fall habe ich gerade die Größe von nvarchar (10) wie folgt konvertiert und eingeschränkt:

CONVERT(NVARCHAR(10), MY_DATE_TIME, 120) => 2016-09-15

Weitere Informationen finden Sie unter: http://www.w3schools.com/sql/func_convert.asp

Eine andere Lösung (wenn Ihr Datum eine Datetime ist) ist ein einfaches CAST :

CAST(MY_DATE_TIME as DATE) => 2016-09-15

2

Versuchen Sie dieses SQL:

select REPLACE(CONVERT(VARCHAR(24),GETDATE(),103),'/','_') + '_'+ 
       REPLACE(CONVERT(VARCHAR(24),GETDATE(),114),':','_')

2

Für SQL Server 2008+ Sie können CONVERT und FORMAT zusammen verwenden.

Zum Beispiel für den Zeitstempel im europäischen Stil (z. B. Deutschland):

CONVERT(VARCHAR, FORMAT(GETDATE(), 'dd.MM.yyyy HH:mm:ss', 'de-DE'))

1

Sie haben nicht gesagt, welche Datenbank, aber mit MySQL ist hier eine einfache Möglichkeit, ein Datum aus einem Zeitstempel abzurufen (und die Konvertierung des Varchar-Typs sollte automatisch erfolgen):

mysql> select date(now());
+-------------+
| date(now()) |
+-------------+
| 2008-09-16  | 
+-------------+
1 row in set (0.00 sec)

1
Überprüfen Sie erneut: Er hat den SQL Server über ein Tag angegeben.
Joel Coehoorn

1

Der kürzeste und einfachste Weg ist:

DECLARE @now AS DATETIME = GETDATE()

SELECT CONVERT(VARCHAR, @now, 23)

1
DECLARE @DateTime DATETIME
SET @DateTime = '2018-11-23 10:03:23'
SELECT CONVERT(VARCHAR(100),@DateTime,121 )


0

Schreiben Sie eine Funktion

CREATE FUNCTION dbo.TO_SAP_DATETIME(@input datetime)
RETURNS VARCHAR(14)
AS BEGIN
    DECLARE @ret VARCHAR(14)
    SET @ret = COALESCE(SUBSTRING(REPLACE(REPLACE(REPLACE(CONVERT(VARCHAR(26), @input, 25),'-',''),' ',''),':',''),1,14),'00000000000000');
    RETURN @ret
END

0
select REPLACE(CONVERT(VARCHAR, FORMAT(GETDATE(), N'dd/MM/yyyy hh:mm:ss tt')),'.', '/')

wird 05/05/2020 10:41:05 AMals Ergebnis geben


-3

Sie sagen nicht, welche Sprache, aber ich gehe davon aus, C#/.NETdass es einen nativen DateTimeDatentyp hat. In diesem Fall konvertieren Sie es einfach mit der ToStringMethode und verwenden Sie einen Formatbezeichner wie:

DateTime d = DateTime.Today;
string result = d.ToString("yyyy-MM-dd");

Ich würde jedoch davor warnen, dies in einer Datenbankabfrage zu verwenden oder in eine SQL-Anweisung zu verketten. Für Datenbanken muss eine bestimmte Formatierungszeichenfolge verwendet werden. Sie sollten den Zeitteil auf Null setzen und die DateTime als SQL-Parameter verwenden, wenn Sie dies erreichen möchten.


In der Frage wird "Ich arbeite an einer Abfrage in SQL Server 2005" erwähnt.
InkHeart

4
@InkHeart und alle nach unten gerichteten Wähler - Diese Antwort wurde 2008 veröffentlicht. Wenn Sie den Bearbeitungsverlauf für die ursprüngliche Frage überprüfen, waren keine Tags und / oder andere technologiebezogene Informationen enthalten.
GSazheniuk
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.