2008-09-16 15 views
226

Ich arbeite an einer Abfrage in Sql Server 2005, wo ich einen Wert in DateTime Variable in eine varchar Variable in yyyy-mm-dd Format konvertieren muss (ohne Zeit Teil). Wie mache ich das?So konvertieren Sie DateTime nach VarChar

Antwort

199

mit Microsoft SQL Server unterstützt:

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

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

Für diejenigen von Ihnen, die interessiert sein könnten, würde dies besser funktionieren, wenn Sie VARCHAR zu CHAR ändern. Siehe diesen Beitrag (http://stackoverflow.com/questions/59667/why-would-ie-ever-pick-char-over-varchar-in-sql) für weitere Details. Im Wesentlichen sind 2 Byte Overhead in VARCHAR vs CHAR involviert. In diesem Szenario wissen wir, dass Ihre Zeichenfolge immer aus 10 Zeichen besteht. Daher ist CHAR angemessen. –

+0

Randnotiz, von dem, was ich gesehen habe, schade, keines der Formate ehrt, was auch immer das DATEFORMAT eingestellt ist, vielleicht gibt es einen anderen Weg. –

+0

Gibt es einen Grund, 'LEFT (.., 10)' anstelle von 'CONVERT (CHAR (10), ...)' zu verwenden? Auch diejenigen, die mit den neueren Versionen von SQL Server als 2005 (!) Arbeiten, sollten [die Antwort von Zar Shardan] (http://stackoverflow.com/a/17713768/1026) ausprobieren, die eine Lösung auf der Basis von 'FORMAT (date_value, format_string) 'Funktion. – Nickolay

8

Entweder Cast oder Convert:

Syntax für CAST:

CAST (expression AS data_type [ (length) ]) 

Syntax für CONVERT:

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

http://msdn.microsoft.com/en-us/library/ms187928.aspx

Eigentlich da Sie gefragt ein spezielles Format:

REPLACE(CONVERT(varchar(10), Date, 102), '.', '-') 
0

Sie nicht die Datenbank sagten, aber mit mysql hier ist eine einfache Möglichkeit, ein Datum aus einem Zeitstempel zu erhalten (und die varchar Typumwandlung sollte automatisch geschehen):

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

überprüfen wieder: er SQL-Server über einen Tag angegeben. –

-3

Sie nicht sagen, welche Sprache, aber ich C#/.NET gehe davon aus, weil es einen native DateTime Datentyp hat. In diesem Fall ist es nur wandelt die ToString Methode und einen Formatbezeichner wie verwenden: Jedoch

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

, würde ich gegen die Verwendung dieses in einer Datenbankabfrage Verwarnung oder in eine SQL-Anweisung verkettet. Datenbanken benötigen eine bestimmte Formatierungszeichenfolge, die verwendet werden soll. Sie sind besser dran, den Zeitteil auf Null zu setzen und DateTime als SQL-Parameter zu verwenden, wenn Sie das erreichen wollen.

+0

In der Frage, es heißt "Ich arbeite an einer Abfrage in Sql Server 2005". – InkHeart

+3

@InkHeart und alle Down-Wähler - Diese Antwort wurde im Jahr 2008 veröffentlicht. Wenn Sie den Verlauf der Änderungen für die ursprüngliche Frage überprüfen, wurden keine Tags und/oder andere Technologie-bezogene Informationen enthalten. – GSazheniuk

10

Beachten Sie, dass YYYY-MM-DD mehrdeutig ist, abhängig von Ihren Spracheinstellungen.beste ISO-Norm YYYYMMDD Verwendung finden this blog post

2
declare @dt datetime 

set @dt = getdate() 

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

ich feste Datenlänge von char(10) haben, wie Sie eine bestimmte Zeichenfolge Format möchten.

2

Versuchen:

select replace(convert(varchar, getdate(), 111),'/','-'); 

Mehr auf ms sql tips

5

- Das gibt Ihnen die Zeit als 0 im Format yyyy-mm-dd 00: 00: 00.000 '


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

Das OP erwähnte datetime Format. Für mich steht der Zeitteil im Weg.
Ich denke, es ist ein wenig sauberer, den Zeitabschnitt vor dem Formatieren zu entfernen (durch das Datieren von Datum bis Datum).

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

Mit Microsoft SQL Server:

Verwendung Syntax für CONVERT:

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

Beispiel:

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

Für den Stil, den Sie hier weitere Informationen finden: MSDN - Cast and Convert (Transact-SQL).

7

Sie können DATEPART(DATEPART, VARIABLE) verwenden. 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) 
1

Dies ist, wie ich es tun: CONVERT(NVARCHAR(10), DATE1, 103))

261

Hier einige Test SQL für alle Stile. Machen Sie nvarchar(max) kürzer zum Zuschneiden (z. B. nvarchar(10)).

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 
+0

Hier wollen wir mal 'dd-mm' oder' jun-28'. Es gibt irgendeine Option ?? – JiLaBaJi

+0

Funktioniert für SQL Server 2005, also ist das großartig für diejenigen von uns, die sich noch immer mit älteren Systemen einmischen. Bald auf Upgrade für 2014 vorbereitet! – dyslexicanaboko

+0

Ich möchte formatieren in der Nähe von 101 - 101 = 28.04.2014, Ich möchte ohne Null im Monat, Ausgabe 28.04.2014, ist es anwendbar? –

-1
CONVERT(VARCHAR, GETDATE(), 23) 
+0

Funktioniert überhaupt nicht. – Daria

0

Der kürzeste und einfachste Weg ist:

DECLARE @now AS DATETIME = GETDATE() 

SELECT CONVERT(VARCHAR, @now, 23) 
1

Sie Ihr Datum in vielen Formaten konvertieren kann, ist der syntaxe einfach zu bedienen :

CONVERT('TheTypeYouWant', 'TheDateToConvert', 'TheCodeForFormating' *) 
CONVERT(NVARCHAR(10), DATE_OF_DAY, 103) => 15/09/2016 
  • Der Code eine ganze Zahl ist, hier 3 die dritte Formating ohne Jahrhundert ist, wenn man das Jahrhundert will einfach nur den Code ändern zu 103.

In Ihrem Fall, habe ich nur umgewandelt und beschränken Größe von nvarchar (10) wie folgt aus:

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

mehr unter: http://www.w3schools.com/sql/func_convert.asp

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

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

Versuchen Sie, diese SQL:

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