Combinant (concaténation) la date et l'heure dans un datetime
À l'aide de SQL Server 2008, cette requête fonctionne très bien:
select CAST(CollectionDate as DATE), CAST(CollectionTime as TIME)
from field
Me donne deux colonnes comme ceci:
2013-01-25 18:53:00.0000000
2013-01-25 18:53:00.0000000
2013-01-25 18:53:00.0000000
2013-01-25 18:53:00.0000000
.
.
.
Je suis en train de les combiner en une seule datetime utilisant le signe plus, comme ceci:
select CAST(CollectionDate as DATE) + CAST(CollectionTime as TIME)
from field
J'ai regardé sur près d'une dizaine de sites web, y compris les réponses sur ce site (comme cette une), et ils semblent tous d'accord que le signe devrait fonctionner, mais j'obtiens l'erreur:
Msg 8117, Niveau 16, État 1, Ligne 1
Opérande type de données date n'est pas valide pour ajouter de l'opérateur.
Tous les champs sont non nulles et non nulles. J'ai aussi essayé la fonction de conversion et essayé de le jeter ces résultats comme varchars, même problème. Cela ne peut pas être aussi dur que je fais.
Quelqu'un peut-il me dire pourquoi cela ne fonctionne pas? Merci pour toute aide.
- Quels sont les types de données d'origine pour chaque colonne?, et si ils sont des chaînes de caractères, comment les données qui y sont stockées? (AAAA-MM-JJ,AAAAMMJJ,etc)
- En fait, la question de suivi à vous et @Aaron Bertrand, si je suis de CASTing (ou de CONVERSION) mes données dans la requête elle-même, importe-t-il si les données sous-jacentes sont stockés sous forme de chaînes ou de dates? Je suis le stockage comme les champs datetime, mais juste curieux.
- bien sûr, il n'importe. Pourquoi aller au moyen de deux niveaux de cast/convertir où vous ne pourriez pas besoin?
- Ils ont été datetimes?. Oui c'est important, on ne peut pas concaténer datetimes, c'est pourquoi j'ai d'abord demandé le type de données
- Aussi, l'on a accepté la réponse suppose que le temps n'est pas de la partie sur
CollectionDate
(comme dans, est un rendez-vous avec00:00:00
). Si ce n'est pas le cas, alors il sera de retour de mauvais résultats. Et le casting d'abord, comme datetime est inutile - pas plus
Vous devez vous connecter pour publier un commentaire.
En supposant que les données sous-jacentes sont les types date/heure date/datetime, etc.
Si ils ne le sont pas, POURQUOI ne PAS, et d'obtenir une réponse significative, vous aurez besoin de nous dire quels types ils sont et de ce format de données est stockée dans. Ou tout simplement fixer la table.
Jeter aux
datetime
à la place:Cela fonctionne sur SQL Server 2008 R2.
Si pour certaines raisons vous avez voulu assurez-vous que la première partie ne dispose pas d'un composant, d'abord lancer le champ de date, puis retour à
datetime
.Msg 402, Level 16, State 1, Line 1 - The data types datetime and time are incompatible in the add operator.
SELECT CAST(GETDATE() as DATETIME) + CAST(GETDATE() as TIME);
dans SQL Server 2008 R2, j'obtiens une valeur de retour qui est de 15 heures et 56 minutes dans le futur, donner ou prendre. @Stanton vous devez valider que ce produit corriger les données, et pas seulement se débarrasser de l'erreur, et comme je l'ai dit, ce sera pause dans les futures versions, donc je serais prudent lorsque vous le mettre en œuvre.Une solution plus simple (testé sur SQL Server 2014 SP1 CU6)
Code:
Ce serait également le travail donné à une table avec une date et une heure spécifique du champ. J'utilise cette méthode fréquemment étant donné que nous avons fournisseur de données qui utilise la date et l'heure dans deux champs distincts.
La solution la plus simple
Cela vous rendra un résultat valide.
Cela fonctionne dans SQL 2008 et 2012 pour produire datetime2:
traiter avec des dates, dateadd doit être utilisé pour la précision
Utilisation Concat Mysql dispose de cette fonction