2013-05-06 3 views
1

Je suis en train d'écrire une requête pour Visual Studio 2012 et de la tester dans Microsoft SQL Server Management Studio à l'aide de SQL Server 2008 R2.SQL DATEADD renvoyant des résultats incorrects

Pour l'instant, j'ai lu l'article de MSDN sur datetimes et DATEADD, mais il semble que ma syntaxe soit correcte. J'ai également lu quelques trucs sur Google ainsi que How to select last one week data from today's date et MySQL: DATE_ADD ainsi que quelques autres articles Stack Overflow.

La requête que je suis en cours d'exécution au moment est vraiment simple, il suffit:

SELECT [DateTime] AS 'Time' 
     ,[RawStatus] AS 'Data' 
    FROM [ADatabase].[dbo].[SomeTable] 
    WHERE CustomPollerAssignmentID = '6570267A-22E1-4556-B344-EB27D9831419' --Latency Poller 
    AND RowID = 000042 --Some Modem Number 
    AND DATEADD(HOUR, -1, CURRENT_TIMESTAMP) <= DateTime 
    ORDER BY DateTime DESC 

Ce que je m'y attendais à faire était de retourner les données (latence du réseau dans ce cas) pour la dernière heure. Au lieu de cela, il revient les trois dernières heures et trente minutes. Lors de l'exécution du code avec l'instruction DATEADD commentée, il s'exécute très bien et renvoie tout pour le jour ou les deux derniers jours, le temps maximum que cette table stocke les données de latence.

Maintenant, le code étrange ci-dessus est calquée sur ce qui est ci-dessous, que je connais des œuvres:

SELECT NMSDS.[SnapshotTimestamp] AS 'Time' 
     ,[LatencyValue] AS 'Latency' 
    FROM [ADifferentDatabase].[dbo].[AnotherTable] Late 
    INNER JOIN ADifferentDatabase.dbo.YetAnotherTable NMSDS ON NMS_Id = 1 
    AND NMSDS.SnapshotID = Late.SnapshotID 
    WHERE DATEADD(HOUR, -6, CURRENT_TIMESTAMP) <= NMSDS.SnapshotTimestamp 
    AND InrouteGroupId = @IRID 
    AND NetworkId = @NTID 
    ORDER BY [Late].SnapshotID ASC 

Mes questions sont les suivantes:

  1. Qu'est-ce que je manque?
  2. Est-ce que j'ai mal formulé ma requête? Et la seconde est pourquoi retournerait-il 3,5 heures au lieu d'un étant donné que la deuxième requête fonctionne réellement et renvoie les choses correctement?
+0

Pas comme cela ferait une différence, mais je ferais probablement 'NMSDS.SnapshotTimestamp> = DATEADD (HOUR, -6, CURRENT_TIMESTAMP)' car il peut utiliser un index. – Kermit

+0

Oui, j'ai essayé de changer l'ordre dans la requête avant de poster quoi que ce soit, mais cela n'a pas changé le comportement étrange. Aussi, comme je l'ai mentionné ci-dessous (et dans le post), le premier ensemble de code est celui qui produit un comportement étrange. Le second est un exemple de code qui fonctionne réellement en utilisant une syntaxe presque identique. –

+0

Essayez d'appliquer ce filtre sur le jeu de résultats 'NMSDS' en premier. – Kermit

Répondre

0

Je dois dire qu'il vous manque des données de fuseau horaire. À partir de vos requêtes, il n'y a pas de données sur le fuseau horaire des serveurs ni sur le fuseau horaire auquel ils insèrent des données.

+0

Cela faisait partie du problème. Il s'avère que le système NMS stocke les données en UTC alors que le serveur est en heure de côte est. Une fois que je l'ai converti, j'ai découvert que les décalages bizarres étaient juste causés par l'isolateur qui s'éteignait par intermittence. Merci, tout le monde! –

0

Que voulez-vous exactement? Voulez-vous les données pour la dernière heure? (c'est-à-dire, s'il est 10:37 vous voulez toutes les données entre 9h00 et 10h00)

ou voulez-vous les données pour la dernière heure? (Par exemple, si elle est 10:37:12 que vous voulez toutes les données entre 09:37:13 et 10:37:12)

Pour la première, changer la clause where

...And NMSDS.SnapshotTimestamp >= 
      DateAdd(hour, datediff(hour, 0, Current_Timestamp)-1, 0), 
    And NMSDS.SnapshotTimestamp < 
      DateAdd(hour, datediff(hour, 0, Current_Timestamp), 0) 

Pour la deuxième , il est plus facile ...

... And NMSDS.SnapshotTimestamp > Current_Timestamp - 1/24 

, mais je dois admettre que je suis vraiment confus par la valeur 6 dans la deuxième requête ... Pourquoi 6, si vous essayez les données pour la dernière unique heure ??

+0

@CharlesBertana Je pense que Cthulhu soulignait que la deuxième requête renvoie les données correctes, tandis que la première requête ne le fait pas et se demande pourquoi, puisque les requêtes semblent similaires dans le format, c'est le cas. – Question3CPO

+0

Oui, c'est vrai. Le deuxième exemple de code est celui qui fonctionne réellement alors que le premier bit de code produit le comportement étrange. –

+0

@CharleBertana Votre solution fonctionne avec le double DATEADDs, mais ne devrais-je pas être capable de le faire avec un seul comme dans la deuxième requête de travail? –

Questions connexes