Comment convertir une date / heure en chaîne dans T-SQL


89

Je suis surpris de ne pas pouvoir trouver cette question ici déjà.

J'ai une variable de date et d'heure et je souhaite la convertir en une chaîne afin de pouvoir l'ajouter à une autre chaîne. Je le veux dans un format qui peut être facilement converti en une date et heure.

Comment puis-je faire ceci?

(Je veux la partie date et la partie heure.)


@TonyHopkinson J'ai aussi eu beaucoup de succès mais ils semblaient tous se convertir dans l'autre sens. Ou vouloir quelque chose de plus compliqué.
cja

3
Tapez Convert, double-cliquez pour mettre en surbrillance, appuyez sur Maj + F1 ... toujours première ligne de défense.
Eric

Réponses:


154

La requête suivante obtiendra la date / heure actuelle et la convertira en chaîne. au format suivant
yyyy-mm-dd hh:mm:ss(24h)

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

47
Je n'arrive toujours pas à surmonter le fait que vous devez passer des nombres arbitraires pour obtenir le bon format
cja

4
@cja Je partage totalement votre surprise. Je souhaite fournir une chaîne, comme yyddss, pour obtenir le format exact que je souhaite. Il y a probablement une raison technique ou historique à cela. Mais encore - très surprenant.
Konrad Viltersten

2
Merci pour la solution rapide, mais dans votre réponse, vous codez les mois en minutes, aaaa-MM-jj hh: mm: ss PAS aaaa-mm-jj hh: mm: ss
Tom Martin

Bien que ce soit vieux, je viens de tomber sur ce fil. Lors de l'utilisation DateTimeOffSet, assurez-vous d'ajuster la varcharlongueur à ce à quoi vous voulez que votre résultat ressemble. Pour moi, je ne voulais pas le fuseau horaire donc j'ai dû utiliserSELECT convert(varchar(19), sysdatetimeoffset(), 120)
RoLYroLLs


7

Vous pouvez utiliser l' convertinstruction dans Microsoft SQL Server pour convertir une date en chaîne. Un exemple de la syntaxe utilisée serait:

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

Ce qui précède renverrait la date et l'heure actuelles dans une chaîne au format YYYY-MM-DD HH:MM:SS24 heures.

Vous pouvez remplacer le nombre à la fin de l'instruction par l'un des nombreux qui modifieront le format des chaînes renvoyées. Une liste de ces codes peut être trouvée sur le MSDN dans la section de référence CAST and CONVERT .


6

Il existe 3 méthodes différentes en fonction de mes besoins et de la version que j'utilise.

Voici les méthodes.

1) Utilisation de Convert

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) Utilisation de Cast (SQL Server 2008 et au-delà)

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) Utilisation du type de données caractère de longueur fixe

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

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

4

En plus des fonctions CASTet CONVERTdes réponses précédentes, si vous utilisez SQL Server 2012 et versions ultérieures, vous utilisez la fonction FORMAT pour convertir un DATETIMEtype basé en chaîne.

Pour reconvertir, utilisez la PARSEou les TRYPARSEfonctions opposées .

Les styles de mise en forme sont basés sur .NET (similaire aux options de mise en forme de chaîne de la méthode ToString ()) et présentent l'avantage de tenir compte de la culture. par exemple.

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')

Résultats:

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

Est-ce que je manque quelque chose ou le problème des OP est-il résolu avec FORMAT (<date var>, 'jj MMMM aaaa HH: mm: ss') ou le format de date personnalisé dont vous avez besoin?!
Grim

@Grim, vous pouvez le faire aussi. À partir de la documentationThe 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

Je pense que vous travaillez trop dur ici. SQL Server a des équivalents de chaîne implicites pour DATETIME2. Ce que vous faites réellement ici, c'est d'utiliser la conversion implicite, puis de formater la chaîne résultante, pas la date / heure.
Jamie Marshall

@JamieMarshall plus ou moins. MSDN suggère: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 / JJ / AAAA

108 - Heure - HH: MI: SS

112 - Date - AAAAMMJJ

121 - ODBC - AAAA-MM-JJ HH: MI: SS.FFF

20 - ODBC - AAAA-MM-JJ HH: MI: SS


1

Beaucoup de gens ont répondu à cette question, mais je pense que la solution la plus simple a été laissée de côté.

SQL SERVER (je crois que son 2012+) a des équivalents de chaîne implicites pour DATETIME2 comme indiqué ici

Regardez la section sur «Formats de littéraux de chaîne pris en charge pour datetime2»

Pour répondre explicitement à la question des OP:

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

production:

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

Remarque: La première variable ( myVar) contient également la valeur '2019-01-23 12:24:00.0000000'. Il est simplement formaté en Jan 23 2019 12:24PMraison du formatage par défaut défini pour SQL SERVER qui est appelé lorsque vous utilisez PRINT. Ne vous laissez pas trébucher ici par cela, la chaîne réelle dans (myVer)='2019-01-23 12:24:00.0000000'


0

Essayez ci-dessous:

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

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

1
Bien !! Doit-on également écrire à GAUCHE?
Gaurav123

Prend 10 premiers caractères, donc si vous en avez besoin si vous voulez juste la date.
ram4nd
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.