Visualizzazione dei risultati da 1 a 8 su 8

Discussione: TimeDiff e Min

  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2004
    Messaggi
    702

    TimeDiff e Min

    Salve a tutti!

    Volevo sapere se vi era mai capitato (e come avete risolto, ovviamente) di dover fare un confronto tra date e prendere il record con la differenza minore con una data di confronto.

    Cerco di spiegarmi come un essere umano:

    ID mydata

    1 2006-08-18 09:00:00
    2 2006-08-18 09:10:00
    3 2006-08-18 09:20:00
    4 2006-08-18 09:30:00
    5 2006-08-18 09:40:00

    Attraverso quale istruizione sql posso sapere che l' ID 3 è quello più vicino alle 9:21:00 ?

    Un saluto a tutti, spero di essere stato abbastanza chiaro.


  2. #2
    Utente di HTML.it L'avatar di Graboid
    Registrato dal
    Oct 2004
    Messaggi
    619
    Credo che servano almeno 2 query:

    1° query:
    SELECT mydata FROM miatabella WHERE mydata <= oradaconfrontare ORDER BY mydata DESC limit 1

    2° query:
    SELECT mydata FROM miatabella WHERE mydata >= oradaconfrontare ORDER BY mydata ASC limit 1

    Con queste due query (occhio che non le ho testate) dovresti ricavare il mydata che piu' si avvicina per difetto (1° query) e per eccesso (2° query).

    Poi devi trasformare le date in formato timestamp in modo da essere comodo a fare sottrazioni.

    Poi confronti il risultato di oradaconfrontare meno il risultato di 1° query con risultato 2° query meno oradaconfrontare e vedi qual'e' piu' piccolo.

    Ciao

  3. #3
    Se la sequenza delle ore e' come hai esemplificato il problema e' di facile soluzione.

    Ammesso che sia cosi' e' chiaro che l'ora piu' vicina e' quella che sta tra le 9:16 e le 9:25

    quindi se:

    8:56 - 9:05 = 9:00
    9:06 - 9:15 = 9:10
    9:16 - 9:25 = 9:20
    9:26 - 9:35 = 9:30

    la query sara':

    codice:
    SELECT * 
    FROM tabella 
    WHERE '2006-08-18 09:21:00'
    BETWEEN mydata - INTERVAL 4 MINUTE 
    AND mydata + INTERVAL 5 MINUTE
    diversa sarebbe la storia se mydata avesse un valore randomize.

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  4. #4
    Utente di HTML.it
    Registrato dal
    Mar 2004
    Messaggi
    702
    Originariamente inviato da piero.mac
    diversa sarebbe la storia se mydata avesse un valore randomize.
    La data è presa dal DB, e l'intervallo non è quantificabile

  5. #5
    Originariamente inviato da borgorosso
    La data è presa dal DB, e l'intervallo non è quantificabile
    Una soluzione pensata velocemente (magari c'e' di meglio) potrebbe essere la seguente con una UNION e tab temporanea.

    codice:
    create temporary table temp
    (SELECT *,
    timediff('2006-08-18 09:21:00', mydata) as diff
    FROM tabella WHERE 
    '2006-08-18 09:21:00' >= mydata
    order by mydata desc
    limit 1)
    UNION
    (SELECT *, 
    timediff(mydata, '2006-08-18 09:21:00') as diff
    FROM tabella WHERE 
    '2006-08-18 09:21:00' <= mydata
    order by mydata asc
    limit 1);
    
    select * from temp
    order by diff
    limit 1;
    se lo provi con phpmyadmin le queries vanno messe nella stessa finestra

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  6. #6
    Utente di HTML.it
    Registrato dal
    Mar 2004
    Messaggi
    702
    eccomi qui: credo di aver trovato la soluzione.

    Con una query di questo tipo:

    SELECT id, IP, dataRichiesta FROM c_preventivi WHERE dataRichiesta = (SELECT MAX(dataRichiesta) FROM c_preventivi WHERE IP = '80.181.48.238' AND dataRichiesta < '2006-8-11 19:42:31')

  7. #7
    Originariamente inviato da borgorosso
    eccomi qui: credo di aver trovato la soluzione.

    Con una query di questo tipo:

    SELECT id, IP, dataRichiesta FROM c_preventivi WHERE dataRichiesta = (SELECT MAX(dataRichiesta) FROM c_preventivi WHERE IP = '80.181.48.238' AND dataRichiesta < '2006-8-11 19:42:31')
    per trovare la data minore di altra non serve fare una subquery.

    Basta order by desc e limit 1

    avevo capito la piu' vicina, come data minore era banale.

    codice:
    SELECT id, IP, dataRichiesta 
    FROM c_preventivi 
    WHERE IP = '80.181.48.238' AND dataRichiesta < '2006-8-11 19:42:31'
    order by dataRichiesta DESC
    limit 1

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  8. #8
    Utente di HTML.it
    Registrato dal
    Mar 2004
    Messaggi
    702
    il problema era trovare la data più minore, non solo la data minore e giustamente la tua soluzione è la più logica.

    mi si scusi l'ingolfamento mentale agostano! :master:

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.