web-dev-qa-db-fra.com

Données SQL Select d'il y a 2 heures

Je voudrais faire un serveur SQL pour sélectionner la sélection de la daterange de (il y a 2 heures) entre (il y a 1 heure)

Est-ce correct:

SELECT * 
FROM tablename 
WHERE dtdatetime BETWEEN DATEADD(hh, -1, GETDATE()) AND DATEADD(hh, -2, GETDATE())
11
Jay
  • n'utilisez pas de raccourci paresseux comme hh. Voici pourquoi .
  • n'utilisez pas BETWEEN. Voici pourquoi . De toute façon, le premier argument doit être le plus petit - votre problème est en fait que vous dites WHERE 2 BETWEEN 3 AND 1 et il ne retournera vrai que si vous le retournez à WHERE 2 BETWEEN 1 AND 3. Allez-y et essayez-le - l'argument le plus petit doit être le premier. Mais vraiment, arrêtez tout de même d'utiliser BETWEEN pour les requêtes de plage de dates.

Voici à quoi devrait ressembler votre requête:

WHERE dtdatetime >= DATEADD(HOUR, -2, GETDATE())
  AND dtdatetime <  DATEADD(HOUR, -1, GETDATE());

Notez que cela donnera des résultats différents selon l'heure à laquelle vous l'exécuterez pendant l'heure actuelle. Par exemple, si vous l'exécutez à 12:32, cela donnera des données> = 10:32 et <11:32. Si vous voulez des données> = 10h00 et <11h00, qu'elles soient exécutées à 12h04 ou 12h32 ou 12h59, alors vous voulez plutôt ceci:

DECLARE @TopOfHour DATETIME;
SET @TopOfHour = DATEADD(HOUR, DATEPART(HOUR, GETDATE()), DATEDIFF(DAY, 0, GETDATE()));

SELECT ...
WHERE dtdatetime >= DATEADD(HOUR, -2, @TopOfHour)
  AND dtdatetime <  DATEADD(HOUR, -1, @TopOfHour);
40
Aaron Bertrand