Comment obtenir la plus proche des dates en sql Oracle
Par exemple, j'ai 2 tables:
T1
id time
1 18:12:02
2 18:46:57
3 17:49:44
4 12:19:24
5 11:00:01
6 17:12:45
et T2
id time
1 18:13:02
2 17:46:57
J'ai besoin d'obtenir le temps de T1 qui sont le plus proche de l'heure de T2. Il n'y a pas de relation entre ces tables.
Il devrait être quelque chose comme ceci:
select T1.calldatetime
from T1, T2
where T1.calldatetime between
T2.calldatetime-(
select MIN(ABS(T2.calldatetime-T1.calldatetime))
from T2, T1)
and
T2.calldatetime+(
select MIN(ABS(T2.calldatetime-T1.calldatetime))
from T2, T1)
Mais je ne peux pas l'obtenir. Des suggestions?
OriginalL'auteur fen1ksss | 2012-12-18
Vous devez vous connecter pour publier un commentaire.
Je crois que c'est la requête que vous êtes à la recherche pour:
Assurez-vous que les colonnes ont la même date de la partie, parce que le t2.le temps t1.la partie du temps ne fonctionne pas autrement.
MODIFIER: Merci pour l'accepter, mais Ben la réponse ci-dessous, c'est mieux. Il utilise Oracle des fonctions analytiques et effectue beaucoup mieux.
OriginalL'auteur mavroprovato
Vous n'avez qu'à utiliser un seul Cartésien se joindre à résoudre votre problème contrairement aux autres solutions, qui utilisent plusieurs. Je suppose que le temps est stocké comme un VARCHAR2. Si elle est stockée comme une date, alors vous pouvez supprimer le TO_DATE fonctions. Si elle est stockée comme une date (je vous recommande fortement), vous devrez supprimer la date portions
J'ai fait un peu verbeux donc il est évident que ce qui se passe.
Fondamentalement, il s'agit de la valeur absolue de la différence entre les temps T1 et T2, puis choisit la plus petite différence par T2
ID
; de renvoyer les données à partir de T1.Ici, il est en SQL Violon format.
La moins jolie (mais courte) format:
OriginalL'auteur Ben
Celui-ci sélectionne cette ligne(s) à partir de T1, qui a/ont la plus petite distance de tout dans T2:
(testé avec mysql, j'espère que vous n'obtenez pas une ORA)
Modifier: selon le dernier commentaire, il devrait être comme ça:
Produit:
Hmm. Donc, vous voulez pour chaque ligne T1 la ligne avec la plus petite diff de en T2? ou pour chaque ligne T2 la plus petite diff en T1?
pour chaque ligne T2 la plus petite diff en T1
OriginalL'auteur pbhd
Une autre façon d'utiliser les fonctions analytiques.
Peut être étrange 🙂
À SQLFiddle... et au-delà!
OriginalL'auteur knagaev
Essayer cette requête de son peu long, je vais essayer de l'optimiser
OriginalL'auteur Ajith Sasidharan