Sql date sélectionne les lignes dans une plage de X secondes
Question
Ma table SQL ressemble à quelque chose comme (message, créé)
Je souhaite sélectionner les lignes qui se trouvent à moins de X secondes les unes des autres. Disons que le dernier message est dans les X secondes de NOW (), alors il devrait le sélectionner. Si le dernier dernier message est dans les X secondes du dernier message, il doit également le sélectionner. En d'autres termes, chaque ligne doit être comparée à la suivante et cochée. Pour la dernière ligne, vérifiez avec say NOW (). Fondamentalement, je veux la dernière session de messages (c'est-à-dire le dernier ensemble de messages que nous avons liés les uns aux autres, en supposant que les messages consécutifs dans un délai de X secondes soient liés les uns aux autres)
Je ne sais pas comment écrire une requête SQL pour cela. Est-ce même possible?
Merci beaucoup pour votre temps.
La solution
Ce script fonctionne sur SQLServer. Vous devriez pouvoir extraire l’instruction select et l’exécuter dans MySQL.
DECLARE @Messages TABLE (Message VARCHAR(10), Created DATETIME)
DECLARE @Interval FLOAT
-- Interval is 1 day.
SET @Interval = 1
-- These should be in result
INSERT INTO @Messages VALUES ('Message1', GetDate())
INSERT INTO @Messages VALUES ('Message2', GetDate()-1)
-- These should not be in result
INSERT INTO @Messages VALUES ('Message3', GetDate()-3)
INSERT INTO @Messages VALUES ('Message4', GetDate()-5)
SELECT m1.Message, m1.Created
FROM @Messages m1
INNER JOIN @Messages m2 ON m2.Created <= m1.Created + @Interval
AND m2.Created >= m1.Created
AND m2.Message <> m1.Message
UNION ALL SELECT m2.Message, m2.Created
FROM @Messages m1
INNER JOIN @Messages m2 ON m2.Created <= m1.Created + @Interval
AND m2.Created >= m1.Created
AND m2.Message <> m1.Message
ORDER BY Created
Autres conseils
Je pense que vous pensez trop compliqué (Mais encore une fois, j'ai peut-être mal compris l'exigence?)
Ceci sélectionne tous les messages créés dans les 30 secondes précédant un message particulier:
SELECT
Id,
MessageText,
MessageDate
FROM
Message
WHERE
TIME_TO_SEC(TIMEDIFF(
(
SELECT MessageDate
FROM Message
WHERE Id = 17
),
MessageDate
)) <= 30
où 17 correspond bien entendu à l'identifiant du message qui vous intéresse et à 30 correspondant au nombre de secondes de votre plage horaire.