Étant donné les composants suivants
DECLARE @D DATE = '2013-10-13'
DECLARE @T TIME(7) = '23:59:59.9999999'
Quel est le meilleur moyen de les combiner pour produire un DATETIME2(7)
résultat avec de la valeur '2013-10-13 23:59:59.9999999'
?
Certaines choses qui ne fonctionnent pas sont énumérées ci-dessous.
SELECT @D + @T
La date du type de données d'opérande n'est pas valide pour l'opérateur add.
SELECT CAST(@D AS DATETIME2(7)) + @T
Le type de données d'opérande datetime2 n'est pas valide pour l'opérateur add.
SELECT DATEADD(NANOSECOND,DATEDIFF(NANOSECOND,CAST('00:00:00.0000000' AS TIME),@T),@D)
La fonction de datiff a entraîné un débordement. Le nombre de dates séparant deux instances de date / heure est trop grand. Essayez d’utiliser datiff avec une date moins précise.
* Le dépassement de capacité peut être évité dans Azure SQL Database et SQL Server 2016, à l'aide de DATEDIFF_BIG
.
SELECT CAST(@D AS DATETIME) + @T
Les types de données date / heure et heure sont incompatibles dans l'opérateur d'ajout.
SELECT CAST(@D AS DATETIME) + CAST(@T AS DATETIME)
Retourne un résultat mais perd de la précision
2013-10-13 23:59:59.997
Pour SQL Server 2012 et les versions ultérieures, il existe la fonction DATETIME2FROMPARTS . Il a cette forme:
Pour les données d'échantillon données, cela devient
qui se traduit par
Les parties peuvent être obtenues à l'aide de DATEPART () si vous partez de types de données temporels ou du texte utilisé pour construire les exemples de valeurs dans la question.
la source
C'est assez stupide de la part de SQL Server de ne pas laisser votre premier exemple fonctionner, et cela va paraître vraiment stupide aussi, mais…
la source
la source
Je cherchais autre chose quand j'ai atterri ici. La question est assez ancienne, mais il y a quelques commentaires et activités récents. Je pensais partager une méthode simple, très similaire à la réponse donnée par @Antario, mais un peu plus courte et que certains trouveraient plus facile à lire:
la source
Vous pouvez tronquer le cast avec DATE pour le tronquer, puis revenir à DATETIME pour ajouter le TIME.
la source