Come convertire DateTime in VarChar


303

Sto lavorando a una query in SQL Server 2005 in cui ho bisogno di convertire un valore in DateTimevariabile in una varcharvariabile in yyyy-mm-ddformato (senza time part). Come lo faccio?


1
CONVERT, consultare la documentazione MSDN .
Jason Cohen,

3
tenere presente che AAAA-MM-GG è ambiguo, a seconda delle impostazioni della lingua. meglio usare lo standard ISO AAAAMMGG, vedere questo post del blog
Andy Irving,

Risposte:


262

Con Microsoft SQL Server:

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

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

12
Per quelli di voi che potrebbero essere interessati, questo avrebbe prestazioni migliori se cambiate VARCHAR in CHAR. Vedi questo post ( stackoverflow.com/questions/59667/… ) per maggiori dettagli. In sostanza, ci sono 2 byte di overhead coinvolti in VARCHAR vs CHAR. In questo scenario, sappiamo che la tua stringa sarà sempre di 10 caratteri, quindi CHAR è appropriato.
Will Ediger,

1
Nota a margine, da quello che ho visto, peccato che nessuno dei formati onori qualunque sia il DATEFORMAT impostato, forse c'è un altro modo.
Alex Nolasco,

3
C'è qualche motivo per usare LEFT(.., 10)invece di CONVERT(CHAR(10), ...)? Anche quelli che lavorano con le versioni più recenti di SQL Server rispetto al 2005 (!) Dovrebbero dare un'occhiata alla risposta di Zar Shardan che suggerisce una soluzione basata sulla FORMAT(date_value, format_string)funzione.
Nickolay,

@Nickolay inoltre FORMAT()è troppo lento rispetto aconvert(char(10),...)
abdul qayyum il

380

Ecco alcuni test sql per tutti gli stili.

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

Ecco il risultato

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

Rendere nvarchar(max)più breve per tagliare il tempo. Per esempio:

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

uscite:

May 18 2018
May 18 2018  9:57AM

Qui a volte vogliamo come dd-mmo jun - 28. C'è qualche opzione ??
Rock,

Funziona con SQL Server 2005, quindi questo è ottimo per quelli di noi che purtroppo continuano a intromettersi con i sistemi più vecchi. Aggiornamento al 2014 presto, eccitato!
dyslexicanaboko,

Voglio formattare vicino a 101 - 101 = 28/04/2014, voglio zero nel mese, uscita 28/04/2014, è applicabile?
Ahmed Abdelqader,

1
L'identificatore del fuso orario Z non manca nello stile 127.
Atishay,

@Atishay "supportato solo durante il cast dai dati dei personaggi a datetime o smalldatetime". Vedi le note 6 e 7 in docs.microsoft.com/de-de/sql/t-sql/functions/…
Colin



9

È possibile utilizzare DATEPART(DATEPART, VARIABLE). Per esempio:

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

- Questo ti dà il tempo come 0 nel formato 'aaaa-mm-gg 00: 00: 00.000'


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

5

Con Microsoft SQL Server:

Usa la sintassi per CONVERT:

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

Esempio:

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

Per lo stile puoi trovare maggiori informazioni qui: MSDN - Cast and Convert (Transact-SQL) .




3
declare @dt datetime

set @dt = getdate()

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

Ho fissato la lunghezza dei dati char(10)come desideri un formato stringa specifico.


2

L'OP ha menzionato il formato datetime . Per me, la parte temporale si mette in mezzo.
Penso che sia un po 'più pulito rimuovere la porzione di tempo (lanciando datetime ad oggi) prima della formattazione.

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

2

Ecco come lo faccio: CONVERT(NVARCHAR(10), DATE1, 103) )


2

Puoi convertire la tua data in molti formati, la sintassi è semplice da usare:

CONVERT('TheTypeYouWant', 'TheDateToConvert', 'TheCodeForFormating' * )
CONVERT(NVARCHAR(10), DATE_OF_DAY, 103) => 15/09/2016
  • Il codice è un numero intero, qui 3 è la terza formulazione senza secolo, se vuoi che il secolo cambi il codice in 103.

Nel tuo caso , ho appena convertito e limitato le dimensioni di nvarchar (10) in questo modo:

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

Scopri di più su: http://www.w3schools.com/sql/func_convert.asp

Un'altra soluzione (se la tua data è un Datetime) è un semplice CAST :

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

2

Prova questo SQL:

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

2

Per SQL Server 2008+ È possibile utilizzare CONVERT e FORMAT insieme.

Ad esempio, per il timestamp in stile europeo (es. Germania):

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

1

Non hai detto quale database, ma con mysql qui è un modo semplice per ottenere una data da un timestamp (e la conversione del tipo varchar dovrebbe avvenire automaticamente):

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

1
Verifica ancora: ha specificato SQL Server tramite un tag.
Joel Coehoorn,

1

Il modo più breve e più semplice è:

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

Scrivi una funzione

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')),'.', '/')

darà 05/05/2020 10:41:05 AMdi conseguenza


-3

Non dici quale lingua, ma presumo C#/.NETperché ha un DateTimetipo di dati nativo . In tal caso, convertilo semplicemente usando il ToStringmetodo e usa un identificatore di formato come:

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

Tuttavia, vorrei evitare di utilizzare questo in una query del database o concatenato in un'istruzione SQL. I database richiedono l'utilizzo di una stringa di formattazione specifica. È meglio azzerare la parte temporale e utilizzare DateTime come parametro SQL se è quello che stai cercando di ottenere.


Nella domanda, viene menzionato "Sto lavorando a una query in SQL Server 2005".
InkHeart,

4
@InkHeart e tutti i votanti negativi: questa risposta è stata pubblicata nel 2008. Se si controlla la cronologia delle modifiche per la domanda originale, non sono stati inclusi tag e / o altre informazioni relative alla tecnologia.
GSazheniuk,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.