Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13

Discussione: Confronto di date

  1. #1

    Confronto di date

    Ciao ragazzi!

    Sql Server e VB.NET.
    Immaginatevi questo: avete una tabella con un elenco di attività. Sapete che ogni attività vi impegna da una data di inizio lavori fino ad una data di fine lavori.
    E poi un elenco di persone che voi distribuite sulle varie attività.
    Il tutto messo su sql server in due tabelle, una appunto con le attività e le date di inizio e fine e l'altra con l'elenco di persone.
    Io decido quindi come impegnare le varie persone sulle attività in fase di pianificazione. Quindi ad ogni id persona c'è abbinato un id attività.
    Una volta pianificato il tutto (immaginatevi centinaia di persone e migliaia di attività, quindi la cosa ha una certa complessità) devo verificare che nessuna persona sia impegnata megli stessi giorni in attività diverse.
    Come posso fare?
    Posso già risolvere la questione a livello di query ad sql?

    Grazie!
    Non piangere per ciò che hai sbagliato ma per quello che non hai fatto per paura di sbagliare.

  2. #2
    Utente di HTML.it
    Registrato dal
    Sep 2002
    Messaggi
    4,127
    ti scrivo non tanto il codice, piuttosto la logica che ci metterei io

    codice:
    Function VerificaDisponibilita (ByVal Data As DateTime, ByVal IDPersona As Integer) As Boolean
    'Esegui query:
    SELECT * FROM [tabella] WHERE Data > [DataInizio] AND Data < [DataFine] AND [IDPersona] = IDPersona
    'questo vuol dire che Data è compreso tra un [DataInizio] e un [DataFine], per cui la tal persona è occupata
    'metti tutto in un DataTable
    If DataTable.Rows.Count > 1
    'porca trota: c'è qualcosa che non va. la tal persona è sì occupata, ma deve essere presente in due posti contemporaneamente.
    Return False
    ElseIf DataTable.Rows.Count = 1
    'perfetto: è occupato in un unico lavoro.
    Return False
    ElseIf DataTable.Rows.Count = 0
    'che equivale ad Else
    'non è occupato, può ancora sgobbare per quella determinata data.
    Return True
    End If
    End Function

  3. #3
    La logica potrebbe funzionare in effetti.
    Ma io non ho una data da confrontare con DataInizio e DataFine.
    Il controllo deve essere totale su tutte le persone e quindi controllare che in nessun giorno di un anno intero ci sia la stessa persona impegnata in più attività.
    Dovrei ciclare tutti i giorni di un anno intero? Forse non è la soluzione migliore (o forse sì?).

    Cosa consiglieresti?
    Non piangere per ciò che hai sbagliato ma per quello che non hai fatto per paura di sbagliare.

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2002
    Messaggi
    4,127
    Il controllo deve essere totale su tutte le persone
    e per questo ti basta rimuovere l'ultimo AND (che tra l'altra m'ero dimenticato di scrivere)
    Dovrei ciclare tutti i giorni di un anno intero?
    di certo è una soluzione. non la migliore, però.
    pensavo che, per ogni IDPersona, si poteva fare un incrocio tra DataFine e DataInizio.
    Mi spiego: se lo stesso IDPersona ha, su due record diversi ovviamente, DataInizio del 2^ record =< del DataFine del 1^ record vuol dire che per almeno un giorno questo è impegnato in due attività.
    segui il ragionamento? soltanto che non mi viene immediatamente come tradurlo in codice..

  5. #5
    Così in effetti quadrerebbe di più.
    Però considera che ad una persona gli sono state pianificate, ad esempio 40 attività in un anno.
    Non si tratterebbe di confrontare il primo record col secondo, ma anche il primo con il terzo, il primo con il quarto e via dicendo, e poi il secondo con il terzo, il secondo con il quarto e via dicendo...no?
    E se invece mi andassi a scrivere singolarmente (che ne so..in un datatable) ogni giorno di attività di una persona, questo per ogni attività, ad esempio:
    la persona 14 è impegnata per l'attività 1 dal 1/1/2005 al 1/6/2005.
    Bene..scrivo 1/1/2005, 2/1/2005, 3/1/2005 ecc..ovviamente verificando se una data esiste già.
    Poi analizzo la seconda attività..e faccio lo stesso. Appena sto per scrivere una data che esiste già mi fermo. E mostro a video la data e l'id dell'attività in modo da andare a rimuovere l'errore in pianificazione. Poi se voglio proseguire per mostrare le altre attività con problemi posso proseguire.
    Potrebbe andare? E potrebbe essere la soluzione migliore?
    Non piangere per ciò che hai sbagliato ma per quello che non hai fatto per paura di sbagliare.

  6. #6
    Un datatable?
    DataTable.Rows.Count > 1 ????

    Siete matti!
    Che bisogno c'è di tirare fuori tanti record e metterli in un datatable per poi solo contarli?

    codice:
    dim objConn as sqlconnection, objCmd as sqlcommand, strSql as string
    
    strSql = "select count(*) FROM [tabella] WHERE Data > [DataInizio] AND Data < [DataFine] AND [IDPersona] = IDPersona"
    
    dim num as integer = objCmd.executescalar()
    Però Gianluca non ha una data da confrontare con DataInizio e DataFine


    Per elencare le persone con delle sovrapposizioni:

    codice:
     
    select idPersona
    from [Tabella] as X
    where 0 < (
        select count(*)
        from [Tabella] as Y
        where X.idPersona = Y.idPersona    -- stessa persona
          and Y.idLavoro <> X.idLavoro     -- altro lavoro
          and X.DataInizio <= Y.DataFine   
          and Y.DataFine >= X.DataInizio   
    )
    
    -- Tratta tutte le sovrapposiz. possibili
    
    -- X     IN--------FI         
    -- Y          IN--------FI    
    -- 
    -- X          IN--------FI         
    -- Y     IN--------FI    
    -- 
    -- X     IN------------------FI         
    -- Y          IN--------FI    
    -- 
    -- X         IN-----FI         
    -- Y     IN--------------FI
    Usa questo come base di partenza se vuoi tirare fuori tutte le sovrapposizioni di ogni persona

    .
    "Perche' il mio alleato e' la Forza. Ed un alleato potente essa e'."

  7. #7
    Utente di HTML.it
    Registrato dal
    Sep 2002
    Messaggi
    4,127
    Siete matti!
    giusta osservazione, ma il mio utilizzo del datatable era basato sul fatto che ho dato per scontato che poi andassero mostrate a video tutte le combinazioni persone/date
    del resto anche la tua soluzione ha uno svantaggio: una volta che hai individuato che è > 1 cosa vai? dici all'utente: "beh guarda, attaccati al tram, questo qua è presente due volte. io so solo questo: adesso arrangiati e cercati nei miliardi di record che hai nel database l'errore"

  8. #8
    Eddai, scusa, non volevo essere villano....
    Il fatto è che Gianluca (anzi: il Gianlupi) è un mio grande amico e tra di noi ci prendiamo per il culo
    "Perche' il mio alleato e' la Forza. Ed un alleato potente essa e'."

  9. #9
    Mmhhh..

    Ora vedo un po' cosa ottengo e poi vi faccio sapere.

    Matteo! Leva subito quella firma che ti sei messo. Chiaro?!

    Non piangere per ciò che hai sbagliato ma per quello che non hai fatto per paura di sbagliare.

  10. #10
    Utente di HTML.it
    Registrato dal
    Sep 2002
    Messaggi
    4,127
    Eddai, scusa, non volevo essere villano....
    macchè villano. non mi sono offeso.
    ho solo "difeso" il mio modo di agire. nessuno ha, purtroppo, la verità in tasca
    Matteo! Leva subito quella firma che ti sei messo. Chiaro?!
    che firma ha? (ho le firme disabilitate)

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.