270 votes

Créer une date avec T-SQL

J'essaye de convertir une date avec des parties individuelles telles que 12, 1, 2007 en date et heure dans SQL Server 2005. J'ai essayé ce qui suit:

 CAST(DATEPART(year, DATE)+'-'+ DATEPART(month, DATE) +'-'+ DATEPART(day, DATE) AS DATETIME)
 

mais cela entraîne une mauvaise date. Quelle est la bonne façon de transformer les trois valeurs de date en un format datetime approprié.

342voto

Charles Bretana Points 59899

Essayez ceci:

Declare @DayOfMonth TinyInt Set @DayOfMonth = 13
Declare @Month TinyInt Set @Month = 6
Declare @Year Integer Set @Year = 2006
-- ------------------------------------
Select DateAdd(day, @DayOfMonth - 1, 
          DateAdd(month, @Month - 1, 
              DateAdd(Year, @Year-1900, 0)))

Cela fonctionne aussi bien, a ajouté l'avantage de ne pas faire toute la chaîne de conversions, c'est de la pure arithmétique de traitement (très rapide) et ce n'est pas la personne à charge sur n'importe quel format de date Cette capitalise sur le fait que SQL Server représentation interne pour les valeurs datetime et smalldatetime est deux partie de la valeur de la première partie de ce qui est un entier représentant le nombre de jours depuis le 1er janvier 1900, et la deuxième partie est une fraction décimale représente la partie fractionnaire d'un jour (pour le moment) --- Si la valeur de l'entier 0 (zéro) toujours se traduit directement en termes de Minuit matin du 1 Janv 1900...

ou, grâce à la suggestion de @brinary,

Select DateAdd(yy, @Year-1900,  
       DateAdd(m,  @Month - 1, @DayOfMonth - 1)) 

256voto

Cade Roux Points 53870

SQL Server 2012 dispose d'une nouvelle fonction DATEFROMPARTS (qui déclenchera une erreur si la date n'est pas valide), ce que j'attendais depuis longtemps. Voici ma principale objection à une solution DATEADD à ce problème:

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

 DATEFROMPARTS(ycolumn, mcolumn, dcolumn)
 

ou

 DATEFROMPARTS(@y, @m, @d)
 

180voto

Cade Roux Points 53870

En supposant que y, m, d sont tous int , qu'en est-il de:

 CAST(CAST(y AS varchar) + '-' + CAST(m AS varchar) + '-' + CAST(d AS varchar) AS DATETIME)
 

S'il vous plaît voir mon autre réponse pour SQL Server 2012 et au-dessus

118voto

Shrike Points 701

Ou en utilisant une seule fonction dateadd:

 DECLARE @day int, @month int, @year int
SELECT @day = 4, @month = 3, @year = 2011

SELECT dateadd(mm, (@year - 1900) * 12 + @month - 1 , @day - 1)
 

13voto

devio Points 22981

Essayez de convertir plutôt que CAST.

Permet de convertir un troisième paramètre qui indique le format de date.

Liste des formats se trouve ici : http://msdn.microsoft.com/en-us/library/ms187928.aspx

Mise à jour après qu’une autre réponse a été choisie comme la réponse « correcte » :

Je ne comprends pas vraiment pourquoi, une réponse est sélectionnée qui dépend clairement les paramètres NLS sur votre serveur, n’indique pas cette restriction.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X