Créer une date à partir de jour, le mois et l'année avec T-SQL
Je suis en train de convertir une date avec des parties individuelles telles que les 12, 1, 2007 dans un datetime de SQL Server 2005. J'ai essayé ce qui suit:
CAST(DATEPART(year, DATE)+'-'+ DATEPART(month, DATE) +'-'+ DATEPART(day, DATE) AS DATETIME)
mais cette résultats dans la mauvaise date. Quelle est la bonne manière de tourner les trois valeurs de date dans un format datetime.
- Envisagez de changer votre accepté de répondre à weblogs.sqlteam.com/jeffs/archive/2007/09/10/...
Vous devez vous connecter pour publier un commentaire.
En supposant
y, m, d
sont tousint
, que diriez-vous:Veuillez voir mon autre réponse pour SQL Server 2012 et au-dessus de
yyyymmdd
format fonctionne indépendamment de ces paramètres. "Un six ou huit chiffres de la chaîne est toujours interprétée comme ymd." docs.microsoft.com/en-us/sql/t-sql/data-types/... Voir cette réponse: stackoverflow.com/a/46064419/2266979Essayez ceci:
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 qu'il ne dépend pas de tout format de la 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,
Édité Octobre 2014. Comme le fait Remarquer @cade Roux, SQL 2012 a maintenant une fonction intégrée:
DATEFROMPARTS(year, month, day)
qui fait la même chose.
Édité 3 Oct 2016, (Merci à @bambams pour s'en rendre compte, et @brinary pour le fixer), La dernière solution proposée par @brinary. ne semble pas fonctionner pour les années bissextiles, sauf années, l'addition est effectuée en premier
@Year = 2001
,@Month = 13
et@DayOfMonth = 32
résultats dans2002-02-01T00:00:00.000
. La accepté de répondre (par Cade Roux) génère une erreur, ce qui est plus utile.Select DateAdd(yy, @Year-1900, DateAdd(m, @Month - 1, @DayOfMonth - 1))
est assez clair et concis.SELECT DATEADD(yy, 2008 - 1900, DATEADD(mm, 2 - 1, 29 - 1));
select dateadd(month, 2 - 1, dateadd(year, 2008 - 1900, 29 - 1));
→ 2008-02-29.SQL Server 2012 a un merveilleux et tant attendue nouvelle DATEFROMPARTS fonction (qui va déclencher une erreur si la date n'est pas valide - ma principale objection à une DATEADD à base de solution à ce problème):
http://msdn.microsoft.com/en-us/library/hh213228.aspx
ou
Ou de l'utilisation d'une seule fonction dateadd:
Sql Server 2012 est une fonction qui va créer de la date en fonction des pièces (DATEFROMPARTS). Pour le reste d'entre nous, voici une db fonction que j'ai créé, qui permettra de déterminer la date à partir de pièces (merci @Charles)...
Vous pouvez l'appeler comme ça...
Est de retour...
Essayer de les CONVERTIR au lieu de CAST.
CONVERTIR permet à un troisième paramètre qui indique le format de la date.
Liste des formats est ici: http://msdn.microsoft.com/en-us/library/ms187928.aspx
Mise à jour après l'autre réponse a été sélectionné en tant que "bonne" réponse:
Je ne comprends vraiment pas pourquoi la réponse est sélectionnée, qui dépend nettement de la NLS paramètres sur votre serveur, sans indication de cette restriction.
Vous pouvez également utiliser
Fonctionne dans SQL depuis ver.2012 et AzureSQL
Il est plus sûr et plus propre d'utiliser explicitement un point de départ "19000101'
declare @output datetime2 = 0
et au lieu de@Year - 1900
utilisation@Year - DATEPART(year,0);
? Cela fonctionne sans aucun jette dans SQL Server 2008 et beaucoup plus clair.Si vous ne voulez pas garder les chaînes hors de lui, cela fonctionne aussi bien (le Mettre dans une fonction):
- Je ajouter une ligne de solution si vous avez besoin d'un datetime de fois la date et l'heure de pièces:
Essayer
Pour les versions de SQL Server en dessous de 12, je peux vous recommander l'utilisation de
CAST
en combinaison avecSET DATEFORMAT
la façon dont vous créez ces chaînes est à vous de
Essayer cette requête:
Résultat:
Je sais que l'OP demande pour SQL 2005 réponse, mais la question est assez vieux donc, si vous exécutez SQL 2012 ou au-dessus, vous pouvez utiliser les éléments suivants:
De référence:
https://docs.microsoft.com/en-us/sql/t-sql/functions/eomonth-transact-sql?view=sql-server-2017&viewFallbackFrom=sql-server-previousversions
Personnellement, je Préfère sous-Chaîne que c'fournir des options de nettoyage et la capacité de diviser la chaîne en tant que de besoin. L'hypothèse est que les données sont au format 'jj, mm, aaaa".
Voici une démonstration de la façon dont elle peut être poursuivie si les données sont stockées dans une colonne. Inutile de dire, elle est idéale pour vérifier le résultat avant de l'appliquer sur la colonne