Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    [MySql] controllo su due date passate e due date nel db

    Buongiorno a tutti,

    ho una tabella che al suo interno contiene due campi DATA in cui sono salvati due range di date, un campo "data_inizio" e uno "data_fine".

    Ora attraverso una ricerca devo controllare se le due date passate sono comprese nel range che ho nei due campi nella tabella, anche solo una delle due.

    Quindi, es. se nella tabella ho:

    "data_inizio" = 2011-06-01 e "data_fine" = 2011-06-30 e passo come range di date:

    2011-06-01 => 2011-06-11
    oppure
    2011-06-15 => 2011-06-25
    oppure
    2011-05-10 => 2011-06-12
    oppure
    2011-06-02 => 2011-07-23

    in tutti questi casi e quelli similari, devo avere un riscontro positivo dalla query.

    Ho provato così:

    codice:
    SELECT * 
    
    FROM lettere 
    
    WHERE id_personale IN(19,33,22) 
    
    AND data_start BETWEEN '2011-06-01' AND '2011-06-29' 
    
    OR data_end BETWEEN '2010-06-01' AND '2011-06-29'
    Ma ovviamente non ottengo quello che mi serve.

    Grazie

    SK

  2. #2
    Credo di aver risolto:

    codice:
    SELECT *
    
    FROM lettere
    
    WHERE id_personale IN(19,33,22) 
    
    AND '2011-05-10' BETWEEN data_start AND data_end 
    
    OR '2011-06-25' BETWEEN data_start AND data_end
    O ci sono vie migliori?

  3. #3
    Senza le parentesi per OR la query risultera' imprevedibile causa la precedenza degli operatori.

    cosi' come l'hai presentata funzionerebbe cosi':

    codice:
    WHERE 
    (id_personale IN(19,33,22) AND '2011-05-10' BETWEEN data_start AND data_end )
    OR 
    ('2011-06-25' BETWEEN data_start AND data_end)
    
    -- mentre tu credo vorresti:
    
    WHERE id_personale IN(19,33,22) 
    AND 
    ('2011-05-10' BETWEEN data_start AND data_end 
    OR 
    '2011-06-25' BETWEEN data_start AND data_end)

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

  4. #4
    Originariamente inviato da piero.mac
    Senza le parentesi per OR la query risultera' imprevedibile causa la precedenza degli operatori.

    cosi' come l'hai presentata funzionerebbe cosi':

    codice:
    WHERE 
    (id_personale IN(19,33,22) AND '2011-05-10' BETWEEN data_start AND data_end )
    OR 
    ('2011-06-25' BETWEEN data_start AND data_end)
    
    -- mentre tu credo vorresti:
    
    WHERE id_personale IN(19,33,22) 
    AND 
    ('2011-05-10' BETWEEN data_start AND data_end 
    OR 
    '2011-06-25' BETWEEN data_start AND data_end)
    Hai ragione Piero, dovendo fare in questo modo come la vedi:

    codice:
    WHERE id_personale='19' AND '2010-06-17' BETWEEN data_start AND data_end
    
    OR id_personale='19' AND '2010-06-18' BETWEEN data_start AND data_end
    
    OR id_personale='19' AND '2010-09-29' BETWEEN data_start AND data_end
    
    OR id_personale='33' AND '2010-06-17' BETWEEN data_start AND data_end
    Essendo tutti OR e tutti confronti tra id e range di date, dovrebbe essere ok o consigli sempre di mettere le parentesi?

  5. #5
    Beh! proprio non mi piace. Premetto che non so cosa vorresti ottenere.

    Se metti id_personale = 19 poi dopo non ha piu' senso mettere id_personale=19 in OR con il confronto di una data. Lo stesso vale per id_personale=33. Non potra' mai essere vera una AND dove id_personale=19 AND id_personale=33

    mettiamo che tu voglia trovare il record che abbia una data compresa tra start ed end e (AND) id_personale = 19
    oppure (OR)
    abbia una data differente compresa sempre tra start ed end ma con id_personale = 33
    allora dovresti calibrare diversamente il where.

    Es.:

    codice:
    WHERE (id_personale='19' AND 
    ('2010-06-17' BETWEEN data_start AND data_end OR '2010-06-18' BETWEEN data_start AND data_end))
    
    OR
    
    (id_personale='33' AND 
    ('2010-09-29' BETWEEN data_start AND data_end OR '2010-06-17' BETWEEN data_start AND data_end))
    in questo caso potresti ricevere sia id_personale=19 che id_personale = 33 oppure solo il 19 o solo il 33 purche' rispettino il range delle date richiesto.

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

  6. #6
    Quello che devo fare è estrarre da una data tabella tutti i record che abbiano come id_personale un determinato id e che i due campi data_start e data_end comprendano una determinata data, se entrambe le condizioni sono soddisfatte allora mi ritorna l'id del record.

    Il fatto è che non trovando altro modo, eseguo prima una query su un'altra tabella dove estraggo gli id_personale e la data abbinata, li metto in due array in modo da avere corrispondenza id=>data, faccio un ciclo e dinamicamente mi creo tutti gli OR, questo perchè devo controllare, prendendo l'esempio precedente, se id_personale = 19 con data 2010-06-17 soddisfi quanto prima, ma anche se id_personale = 33 con data 2010-06-17 soddisfi i criteri, nel caso che entrambi siano soddisfatti avro' due id che rappresentano i record da estrarre dalla tabella.

    Non so se mi sono spiegato

  7. #7
    Originariamente inviato da serialkiller
    Quello che devo fare è estrarre da una data tabella tutti i record che abbiano come id_personale un determinato id e che i due campi data_start e data_end comprendano una determinata data, se entrambe le condizioni sono soddisfatte allora mi ritorna l'id del record.

    Il fatto è che non trovando altro modo, eseguo prima una query su un'altra tabella dove estraggo gli id_personale e la data abbinata, li metto in due array in modo da avere corrispondenza id=>data, faccio un ciclo e dinamicamente mi creo tutti gli OR, questo perchè devo controllare, prendendo l'esempio precedente, se id_personale = 19 con data 2010-06-17 soddisfi quanto prima, ma anche se id_personale = 33 con data 2010-06-17 soddisfi i criteri, nel caso che entrambi siano soddisfatti avro' due id che rappresentano i record da estrarre dalla tabella.

    Non so se mi sono spiegato
    se ho capito bene dovresti fare qualcosa di simile:

    codice:
    where id_personale IN( 19, 33)
    and
    '2010-06-17' BETWEEN data_start AND data_end

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

  8. #8
    Ti ringrazio, ora provo a trovare la soluzione migliore per le mie esigenze.

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.