J'essaie de convertir une date avec des parties individuelles telles que 12, 1, 2007 en une date / 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 se traduit par une mauvaise date. Quelle est la bonne façon de transformer les trois valeurs de date en un format datetime approprié.
sql
sql-server
sql-server-2005
tsql
Brandon
la source
la source
Réponses:
En supposant que
y, m, d
tout estint
, que diriez-vous:Veuillez consulter mon autre réponse pour SQL Server 2012 et supérieur
la source
yyyymmdd
format fonctionne indépendamment de ces paramètres. "Une chaîne de six ou huit chiffres 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/2266979Essaye ça:
Il fonctionne également, a l'avantage supplémentaire de ne pas effectuer de conversions de chaînes, il s'agit donc d'un traitement arithmétique pur (très rapide) et ne dépend d'aucun format de date. Cela capitalise sur le fait que la représentation interne de SQL Server pour les valeurs datetime et smalldatetime est de deux valeur de la partie dont la première partie 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ésentant la partie fractionnaire d'un jour (pour l'heure) --- Donc, la valeur entière 0 (zéro ) se traduit toujours directement en minuit matin du 1er janvier 1900 ...
ou, grâce à la suggestion de @brinary,
Édité en octobre 2014. Comme noté par @cade Roux, SQL 2012 a maintenant une fonction intégrée:
DATEFROMPARTS(year, month, day)
cela fait la même chose.
Édité le 3 octobre 2016, (Merci à @bambams pour l'avoir remarqué et à @brinary pour l'avoir corrigé), La dernière solution, proposée par @brinary. ne semble pas fonctionner pendant les années bissextiles, sauf si l'addition des années est effectuée en premier
la source
@Year = 2001
, par exemple ,@Month = 13
et@DayOfMonth = 32
entraîne2002-02-01T00:00:00.000
. La réponse acceptée (par Cade Roux) génère une erreur, ce qui est plus utile.SQL Server 2012 a une nouvelle fonction DATEFROMPARTS merveilleuse et attendue depuis longtemps (qui générera une erreur si la date n'est pas valide - ma principale objection à une solution basée sur DATEADD à ce problème):
http://msdn.microsoft.com/en-us/library/hh213228.aspx
ou
la source
Ou en utilisant une seule fonction dateadd:
la source
Sql Server 2012 a une fonction qui créera la date en fonction des pièces ( DATEFROMPARTS ). Pour le reste d'entre nous, voici une fonction db que j'ai créée qui déterminera la date des pièces (merci @Charles) ...
Vous pouvez l'appeler comme ça ...
Retour...
la source
Essayez CONVERT au lieu de CAST.
CONVERT permet un troisième paramètre indiquant le format de la date.
La liste des formats est ici: http://msdn.microsoft.com/en-us/library/ms187928.aspx
Mettre à jour après qu'une autre réponse a été sélectionnée comme réponse "correcte":
Je ne comprends pas vraiment pourquoi une réponse est sélectionnée qui dépend clairement des paramètres NLS sur votre serveur, sans indiquer cette restriction.
la source
Vous pouvez aussi utiliser
Fonctionne en SQL depuis ver.2012 et AzureSQL
la source
Il est plus sûr et plus propre d'utiliser un point de départ explicite '19000101'
la source
declare @output datetime2 = 0
et au lieu d'@Year - 1900
utiliser@Year - DATEPART(year,0);
? Cela fonctionne sans transtypage dans SQL Server 2008 et beaucoup plus clair.Si vous ne voulez pas en garder les chaînes, cela fonctionne aussi (mettez-le dans une fonction):
la source
J'ajoute une solution sur une seule ligne si vous avez besoin d'un datetime à partir de la date et de l'heure :
la source
Essayer
la source
Pour les versions de SQL Server inférieures à 12, je peux recommander l'utilisation de
CAST
en combinaison avecSET DATEFORMAT
la façon dont vous créez ces chaînes dépend de vous
la source
Essayez cette requête:
Résultat:
la source
Je sais que l'OP demande une réponse à SQL 2005, mais la question est assez ancienne, donc si vous exécutez SQL 2012 ou supérieur, vous pouvez utiliser ce qui suit:
Référence: https://docs.microsoft.com/en-us/sql/t-sql/functions/eomonth-transact-sql?view=sql-server-2017&viewFallbackFrom=sql-server-previousversions
la source
Personnellement, je préfère la sous-chaîne car elle offre des options de nettoyage et la possibilité de diviser la chaîne au besoin. L'hypothèse est que les données sont au format «jj, mm, aaaa».
Voici une démonstration de la façon dont il peut être poursuivi si les données sont stockées dans une colonne. Inutile de dire que son idéal pour vérifier l'ensemble de résultats avant d'appliquer à la colonne
la source