Dans MS SQL 2000 et 2005, compte tenu d'un datetime comme "2008-09-25 12:34:56" quel est le moyen le plus efficace pour obtenir un datetime contenant seulement "2008-09-25'?
Dupliqué ici.
Dans MS SQL 2000 et 2005, compte tenu d'un datetime comme "2008-09-25 12:34:56" quel est le moyen le plus efficace pour obtenir un datetime contenant seulement "2008-09-25'?
Dupliqué ici.
Je dois avouer que je n'avais pas vu le sol-flotteur de conversion illustré par Matt avant. J'ai eu de la tester.
J'ai testé un pur sélectionnez (qui renvoie la Date et l'Heure, ce n'est pas ce que nous voulons), le champion de la solution ici (plancher flottant), une commune "naïve" celui qui est mentionné ici (stringconvert) et celui qui est mentionné ici que j'ai été en utilisant (comme je pensais que c'était plus rapide).
J'ai testé les requêtes sur un test de serveur MS SQL Server 2005 sur un Win 2003 Server SP2 avec un Xeon 3GHz PROCESSEUR exécute sur max de mémoire (32 bits, alors que 3,5 Go). C'est la nuit où je suis pour que la machine tourne à presque pas de charge. Je l'ai pour moi tout seul.
Voici le journal de mon essai de la sélection d'une grande table contenant les horodatages variant jusqu'à la milliseconde. Cet ensemble de données comprend des dates allant de plus de 2,5 ans. La table elle-même a plus de 130 millions de lignes, c'est pourquoi j'ai restreindre au sommet millions de dollars.
SELECT TOP 1000000 CRETS FROM tblMeasureLogv2
SELECT TOP 1000000 CAST(FLOOR(CAST(CRETS AS FLOAT)) AS DATETIME) FROM tblMeasureLogv2
SELECT TOP 1000000 CONVERT(DATETIME, CONVERT(VARCHAR(10), CRETS, 120) , 120) FROM tblMeasureLogv2
SELECT TOP 1000000 DATEADD(DAY, DATEDIFF(DAY, 0, CRETS), 0) FROM tblMeasureLogv2
SQL Server d'analyser et de compiler des temps: temps CPU = 0 ms, le temps écoulé = 1 ms.
(1000000 de ligne(s) affectée) Table 'tblMeasureLogv2'. Analyse nombre 1, lectures logiques 4752, lectures physiques 0, lectures anticipées 0, lectures logiques lob 0, lectures physiques lob 0, lectures anticipées lob 0.
SQL Server délais d'Exécution: le temps CPU = 422 ms, temps écoulé = 33803 mme.
(1000000 de ligne(s) affectée) Table 'tblMeasureLogv2'. Analyse nombre 1, lectures logiques 4752, lectures physiques 0, lectures anticipées 0, lectures logiques lob 0, lectures physiques lob 0, lectures anticipées lob 0.
SQL Server délais d'Exécution: le temps CPU = 625 ms, temps écoulé = 33545 mme.
(1000000 de ligne(s) affectée) Table 'tblMeasureLogv2'. Analyse nombre 1, lectures logiques 4752, lectures physiques 0, lectures anticipées 0, lectures logiques lob 0, lectures physiques lob 0, lectures anticipées lob 0.
SQL Server délais d'Exécution: le temps CPU = 1953 ms, temps écoulé = 33843 mme.
(1000000 de ligne(s) affectée) Table 'tblMeasureLogv2'. Analyse nombre 1, lectures logiques 4752, lectures physiques 0, lectures anticipées 0, lectures logiques lob 0, lectures physiques lob 0, lectures anticipées lob 0.
SQL Server délais d'Exécution: le temps CPU = 531 ms, temps écoulé = 33440 mme. SQL Server d'analyser et de compiler des temps: temps CPU = 0 ms, le temps écoulé = 1 ms.
SQL Server délais d'Exécution: le temps CPU = 0 ms, le temps écoulé = 1 ms.
Que voyons-nous ici?
Concentrons-nous sur le temps de calcul (nous sommes à la recherche à la conversion), et nous pouvons voir que nous avons les chiffres suivants:
Pure-Select: 422
Floor-cast: 625
String-conv: 1953
DateAdd: 531
De ce fait, il me semble que la DateAdd (au moins dans ce cas particulier) est légèrement plus rapide que le sol en fonte de la méthode.
Avant d'y aller, j'ai couru ce test plusieurs fois, avec l'ordre des requêtes modifiées, même-ish résultats.
Est-ce quelque chose d'étrange sur mon serveur, ou quoi?
Select DateAdd(Day, DateDiff(Day, 0, GetDate()), 0)
DateDiff(Jour, 0, GetDate()) est la même que DateDiff(Jour, '1900-01-01', GetDate ()),
Depuis DateDiff retourne un entier, vous obtiendrez le nombre de jours écoulés depuis le 1er janvier 1900. Vous pouvez ensuite ajouter que nombre entier de jours au 1er janvier 1900. L'effet net est en retrait de la composante temporelle.
Je devrais aussi mentionner que cette méthode fonctionne pour n'importe quelle date/heure de la partie (comme l'année, trimestre, mois, jour, heure, minute et seconde).
Select DateAdd(Year, DateDiff(Year, 0, GetDate()), 0)
Select DateAdd(Quarter, DateDiff(Quarter, 0, GetDate()), 0)
Select DateAdd(Month, DateDiff(Month, 0, GetDate()), 0)
Select DateAdd(Day, DateDiff(Day, 0, GetDate()), 0)
Select DateAdd(Hour, DateDiff(Hour, 0, GetDate()), 0)
Select DateAdd(Second, DateDiff(Second, '20000101', GetDate()), '20000101')
La dernière, pour les secondes, nécessite un traitement spécial. Si vous utilisez Jan 1, 1900, vous obtiendrez une erreur.
Différence de deux colonnes datetime causé le débordement lors de l'exécution.
Vous pouvez contourner cette erreur en utilisant une date de référence différente (comme Jan 1, 2000).
select cast(floor(cast(@datetime as float)) as datetime)
Fonctionne parce que le moulage d'un datetime flotter donne le nombre de jours (y compris les fractions de jour) depuis le 1er janvier 1900. Revêtement de sol, il supprime les fractions de jours et de feuilles, le nombre de jours entiers, qui peuvent ensuite être jeté en arrière datetime.
Pour obtenir AAAA-MM-JJ, utilisez:
select convert(varchar(10), getdate(), 120)
Edit: Oups, il veut un DateTime au lieu d'une chaîne. L'équivalent de TRUNC() dans Oracle. Vous pouvez prendre ce que j'ai posté et jeté en arrière DateTime:
select convert(datetime, convert(varchar(10), getdate(), 120) , 120)
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.