Filtro date

domenica 15 febbraio 2015 - 14.05
Tag Elenco Tags  VB.NET  |  .NET 4.0  |  Visual Studio 2010

Mau67 Profilo | Expert

Un saluto a tutto il forum,
stò impazzendo su un problema banale che non riesco a risolvere, devo filtrare dei dati in una select in base alla data di Assunzione:
faccio un esempio

data assunzione 01/01/1978 ditta xxxxxxx
data assunzione 01/04/1981 ditta yyyyyyy
data assunzione 12/05/1981 ditta xxxxxxx

praticamente se apro il programma con l'orologio di sistema impostato in una data nell'anno 1978 devo visualizzare il dipendente sotto la ditta xxxxxxxxx
se l'orologio di sistema è impostato in una data nell'anno 1981 devo visualizzare il dipendente sotto la ditta yyyyyyyy escludendo la visualizzazione sotto la ditta xxxxxx


ringrazio in anticipo

Mau67

jekisi Profilo | Senior Member

Prima di risponderti mi dici che tipo di db usi?

Se Access o altro.

Nella ricerca metti in considerazione Giorno - Mese - Anno e poi la Ditta o solo l' Anno e poi la Ditta.

Distinti Saluti

Fabio Messina

Mau67 Profilo | Expert

ciao
allora uso MySQL come database
grazie
Mau67

jekisi Profilo | Senior Member

E allora non posso aiutarti.

Mau67 Profilo | Expert

Ok grazie
Mau67

Davide1986 Profilo | Junior Member

Ciao Mau67, voglio provare a risponderti aiutando a creare una giusta Query.

Ma prima mi dovresti rispondere a qualche domanda :

Tra parità di Anno uguale , Mese e Giorno diverso tu quale scegli? (Se ho capito bene scegli quella più piccola)

data assunzione 01/04/1981 ditta yyyyyyy
data assunzione 12/05/1981 ditta xxxxxxx

Tra parità di Anno e Mese uguali, tu che scegli? (Se ipotizzo bene scegli quello con il giorno più piccolo)

data assunzione 01/05/1981 ditta yyyyyyy
data assunzione 12/05/1981 ditta xxxxxxx

Prima di scriverti la query mi potresti scrivere la struttura della tua tabella?

Esempio (ipotizzo una tabella : tb_assunzione)

IDrecord (Type:INT) | DataAssunzione (Type:DATE) | Ditta (Type:TEXT)

Tanto per farti capire una ipotetica Query grossolana non raffinata è questa :

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Saluti Davide.

P.S. Se per caso il campo DataAssunzione è di tipo VARCHAR (10) la Query deve essere modificata come segue :

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra



Blog ImaginSystems
http://blogs.dotnethell.it/imaginsystems
http://www.imaginsystems.it
http://www.alpacasrl.it

Mau67 Profilo | Expert

Ciao Davide,
intanto grazie per avermi risposto, poi per quanto riguarda le date io devo caricare nell°albero di una treeview strutturato per nome azienda, carico il personale sotto la relativa azienda filtrandolo in base alla data di sistema.

Detto questo cosa avviene materialmente nella mia tabella con questa struttura
ID
ID_NOMINATIVO
DATA_INIZIO
DATA_FINE
ID_AZIENDA

Quindi io carico il dipendente in questa tabella es. il 01/01/1980 AZIENDA xxxxxxxx
poi arriva una comunicazione che dalla data 22/01/1980 passa AZIENDA xxxxxxxx unità operativa 2
poi arriva una comunicazione che dalla data 10/08/1980 passa AZIENDA xxxxxxxx unità operativa 4
poi arriva una comunicazione che dalla data 07/02/1981 passa AZIENDA xxxxxxxx unità operativa 7

Quindi siccome le comunicazioni sono svariate e arrivano quasi sempre contestualmente soventemente sfugge qualche variazione quindi volevo inserire le varie comunicazioni al momento che arrivano, ma voglio visualizzare gli spostamenti alle date di spostamento tralasciando quelle già trascorse, e senza visualizzare quelle successive fino alla data di sistema.
Spero di essere stato chiaro.
capisco che esprimere un pensiero senza vedere materialmente non e facile
grazie
Mau67

Davide1986 Profilo | Junior Member

Prima di risponderti mi potresti fare un esempio? già ho visto il tuo esempio precedente e qualche idea me la sono fatta.

Vorrei capire bene cosa intendi con questa frase?

"ma voglio visualizzare gli spostamenti alle date di spostamento tralasciando quelle già trascorse, e senza visualizzare quelle successive fino alla data di sistema"

Con questa frase, capisco che vuoi fare un between tra due date una che inserisci tu e una quella di sistema (Con Data di Sistema intendo quella del SistemaOperativo o quella del server MySql) .

Se inserisci una Data come la inserisci , parziale solo Anno o completa (Giorno / Mese / Anno)?
Senza Visualizzare quelle successive intendi fino alla data di sistema , intendi escludi tutto ciò che è dopo dd/mm/yyyy data di sistema (Giusto?)

L'esempio che ti chiedo è quale input tu hai a disposizione e come vuoi l'output? In sintesi come ti sei immaginato l'output di questa Query? ti possono sembrare banali queste domande ma mi aiutano a capire meglio il contesto, alcune cose ti possono sembrare sotto intese ma a chi non conosce tutto il contesto non lo sono.

Saluti Davide.

Blog ImaginSystems
http://blogs.dotnethell.it/imaginsystems
http://www.imaginsystems.it
http://www.alpacasrl.it

Mau67 Profilo | Expert

ciao Davide la between deve avvenire tra la data_inizio e la data_fine e se la data_fine e null deve restituire la data di sistema per di ogni record in base alla data di sistema.

esempio
data_inizio 01/01/1980 data_fine 27/02/1980 se la data di sistema e superiore al 27/02/1980 questo record non deve essere preso in considerazione
data_inizio 28/02/1980 data_fine 27/05/2013 se la data di sistema e superiore al 27/05/2013 questo record non deve essere preso in considerazione
data_inizio 28/02/2013 data_fine 27/10/2015 la data di sistema e oggi 16/02/2015 questo record deve essere preso in considerazione fino al 27/10/2015
data_inizio 28/10/2015 data_fine 03/04/2016 questo record deve essere preso in considerazione dalla data 28/10/2015 fino al 03/04/2016 e non visibile prima
data_inizio 04/04/2016 data_fine null questo record deve essere preso in considerazione dalla data 04/04/2016 in poi e non visibile prima

Spero di averti chiarito i dubbi
Grazie
Mau67

Davide1986 Profilo | Junior Member

Situazione Elementi presenti nel DataBase

IDRecord | DataInizio | DataFine | Ditta |
-----------------------------------------------------
01 | 01/01/1980 | 27/02/1980 | ditta1|
02 | 28/02/1980 | 27/05/2013 | ditta2|
03 | 28/02/2013 | 27/02/2015 | ditta3|
04 | 28/10/2015 | 03/04/2016 | ditta4|
04 | 04/04/2016 | null | ditta5|

Se ho capito bene tu fai le seguenti verifiche :

PRIMO CASO : Fai una verifica che la DataSistema è compresa tra DataInizio e DataFine.

(Esempio : DataSistema= 28/02/1980)

Esiti verifica :
TRUE - Visualizza ( Deve apparire il record se la DataSistema è inferiore)
FALSE - Non Visualizza (Se la DataSistema è maggiore scarta Record)

Io userei una CREATE VIEW o CREATE OR REPLACE VIEW in questa maniera :

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Ipotetica query :
a- Prima seleziono tutti i record che rispettano la condizione che DataInizio sia più piccola della DataSistema
b- Verifico che DataFine sia più Grande della DataSistema
c- Aggiungo tutti i record dove DataFine era nulla ma che DataInizio sia Uguale o Maggiore di DataSistema

//DataSistema = 1980/02/28 SELECT DISTINCT tb1.`id`, tb1.`DataInizio`, tb1.`DataFine` , tb1.`Ditta` FROM `tb_assunzione` as tb1 WHERE (tb1.`DataInizio`<='1980/02/28') AND EXISTS ( SELECT * FROM ElencoDate WHERE (ElencoDate.`DataFine` > '1980/02/28' ) AND ElencoDate.`id` = tb1.`id` ) OR EXISTS( SELECT * FROM ElencoDateNulle WHERE (ElencoDateNulle.`DataInizio`>='1980/02/28') AND ElencoDateNulle.`id` = tb1.`id` ) //DataSistema = 2015/10/28 SELECT DISTINCT tb1.`id`, tb1.`DataInizio`, tb1.`DataFine` , tb1.`Ditta` FROM `tb_assunzione` as tb1 WHERE (tb1.`DataInizio`<='2015/10/28') AND EXISTS ( SELECT * FROM ElencoDate WHERE (ElencoDate.`DataFine` > '2015/10/28' ) AND ElencoDate.`id` = tb1.`id` ) OR EXISTS( SELECT * FROM ElencoDateNulle WHERE (ElencoDateNulle.`DataInizio`>='2015/10/28') AND ElencoDateNulle.`id` = tb1.`id` ) //DataSistema = 2015/02/16 SELECT DISTINCT tb1.`id`, tb1.`DataInizio`, tb1.`DataFine` , tb1.`Ditta` FROM `tb_assunzione` as tb1 WHERE (tb1.`DataInizio`<='2015/02/16') AND EXISTS ( SELECT * FROM ElencoDate WHERE (ElencoDate.`DataFine` > '2015/02/16' ) AND ElencoDate.`id` = tb1.`id` ) OR EXISTS( SELECT * FROM ElencoDateNulle WHERE (ElencoDateNulle.`DataInizio`>='2015/02/16') AND ElencoDateNulle.`id` = tb1.`id` ) //DataSistema = 2016/04/04 SELECT DISTINCT tb1.`id`, tb1.`DataInizio`, tb1.`DataFine` , tb1.`Ditta` FROM `tb_assunzione` as tb1 WHERE (tb1.`DataInizio`<='2016/04/04') AND EXISTS ( SELECT * FROM ElencoDate WHERE (ElencoDate.`DataFine` > '2016/04/04' ) AND ElencoDate.`id` = tb1.`id` ) OR EXISTS( SELECT * FROM ElencoDateNulle WHERE (ElencoDateNulle.`DataInizio`>='2016/04/04') AND ElencoDateNulle.`id` = tb1.`id` )

Non ho avuto tempo per verificare la correttezza, mi pare che fungono.

Saluti Davide

P.S. Quando ho un attimo di tempo verifico
Blog ImaginSystems
http://blogs.dotnethell.it/imaginsystems
http://www.imaginsystems.it
http://www.alpacasrl.it

Mau67 Profilo | Expert

Ciao Davide,
grazie per l aiuto provo il codice e ti faccio sapere prima di chiudere il post

Ciao
Mau67
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5