Il controllo di un record è dovuto in base al campo 'occuring'

1

Ho dei record con date contro di loro e un campo che contiene none , yearly e monthly

id    status    note   date        last_updated   occurring
1     open      ---    01/01/2011  01/02/2010     yearly
2     open      ---    05/05/2011  03/05/2011     monthly
3     open      ---    06/06/2011  05/06/2011     none

Ora devo essere in grado di verificare se un record è scaduto (la data impostata è passata) che funziona perfettamente se occurring è impostato su none ma non sono sicuro di come avvicinarlo quando è impostato su annuale o mensile (IE: è passato questo giorno dell'anno / mese)

Quindi, con i record di cui sopra, se avessi un metodo sul record chiamato due? che fornisce lo stato è 'aperto' deve restituire true ogni anno quando ha superato quella data se non è stato aggiornato entro l'anno ancora.

Mi scuso se questo è fonte di confusione, ma mi sta sciogliendo il cervello solo cercando di pensarci, per non parlare di metterlo in parole.

    
posta andy 04.10.2013 - 10:42
fonte

3 risposte

1

Prima di tutto, prova a scoprire se la piattaforma che stai utilizzando ha operazioni di data, libreria incorporata o di terze parti.

Ad esempio, se si utilizza PostgreSQL, è possibile trovare le informazioni appropriate nella pagina di documentazione .

Si spera che la libreria sia abbastanza buona da fornire funzioni come l'inizio del mese e la fine del mese e il delta temporale. Il minimo è riuscire a suddividere la data nelle parti e crearne una nuova dalle parti, e ovviamente essere in grado di confrontare le date. Un buon bonus è quello di essere in grado di trovare il mese precedente e il mese successivo, ma questi potrebbero essere composti dall'inizio del mese e aggiungendo / sottora i giorni: -1 per il mese precedente, +33 per il mese successivo.

L'inizio del mese può essere facilmente costruito impostando il giorno a 1. Inizio dell'anno - impostando sia il mese che il giorno a 1.

Se ho capito bene, devi trovare la "data di scadenza" precedente e successiva e quindi applicare le operazioni di confronto della data. Prima trova la data di scadenza in "questo mese", successivamente, nel mese precedente o nel mese successivo (controlla la logica del periodo per decidere quale, o controlla entrambi i periodi).

Se la tua piattaforma non ha una buona libreria di date, cerca una libreria open source nella lingua che tu capisci meglio e prova a portarla sulla tua piattaforma.

Forse, ti aiuterà a capire la logica di due_date, se puoi pensare a True condition che significa last_update che appartiene ad uno dei "due_date periods" (il periodo ha date di inizio e di fine). Il trucco si riduce quindi a costruisci e verifica solo i periodi vicini utilizzando funzioni / operazioni dalla libreria datetime della tua piattaforma .

    
risposta data 04.10.2013 - 21:37
fonte
0

Per prima cosa devi essere in grado di fare l'aritmetica della data. Devi essere in grado di trasformare una data in un numero e viceversa. Dato un numero, devi essere in grado di trovare l'inizio e la fine del mese e dell'anno in cui rientra. Devi essere in grado di aggiungere 4 mesi a, diciamo, il 22 ottobre 2012. Questo non è troppo difficile da fare da solo (l'ho fatto) ma al giorno d'oggi ci sarà sicuramente una classe Date o una libreria che farà il lavoro per te.

Quindi, per un evento mensile, genera una data utilizzando il mese e l'anno di oggi più il giorno del mese a causa dell'aggiornamento. Se la data risultante è successiva alla data odierna (utilizzando l'aritmetica della data), sottrarre un mese da essa (utilizzando l'aritmetica della data). Questa è la data di scadenza più recente. Se last_updated è precedente, il prossimo aggiornamento è scaduto. Puoi fare la stessa cosa con gli anni, ma buttare il mese e il giorno.

Potresti aver bisogno di array per controllare gli aggiornamenti. Essere in anticipo con un aggiornamento potrebbe essere una buona cosa e non vorrai ignorarne uno. Le matrici devono essere indicizzate in base ai numeri del mese o dell'anno (meno un offset per la data di inizio dell'array), che sarà necessario riconvertire al numero di data di base. Spero che la tua libreria Date possa gestirlo. Fai attenzione ad usare sempre la libreria: se dimentichi e aggiungi 3 giorni a una data numero con un semplice numero intero, potresti finire con il 31 febbraio.

Spero che questo ti possa iniziare.

    
risposta data 04.10.2013 - 21:28
fonte
0

Vedo qui due grossi problemi.

1 - Quando non puoi spiegare quale sia il problema in modo chiaro, prendi questo come un segnale di avvertimento che non ci hai ancora pensato. È fondamentale per la comprensione del problema che puoi spiegarlo chiaramente e devi farlo prima di iniziare a creare campi in un database.

Un altro sintomo di ciò è la denominazione del campo, in cui sono presenti campi denominati in base ai tipi (come date ) che non ti dice nulla su cosa significhi quel campo. Questo è qualcosa che dovresti vedere come un segnale di avvertimento quando tu o altri intorno a voi lo fate. È quel campo l'ultima volta che il record è stato modificato (quindi forse dovrebbe essere chiamato 'modificato') o il compleanno del soggetto (nel qual caso forse 'dob' o 'compleanno'). Dargli un nome utile ti aiuterà o chiunque debba gestire il codice che hai creato.

2 - Risolvere il problema reale ... da quello che posso raccogliere, ad esempio, hai una sorta di sistema di promemoria / fatturazione che opera su periodi diversi per i clienti con un account aperto. Quindi è meglio considerare questo problema in isolamento per ora, e per i nostri scopi id , status , note non sono campi rilevanti per questo problema.

Hai bisogno di 2 campi per arrivare alla soluzione:

due - data, nullable - quando il prossimo promemoria / azione è dovuto

recurs - data / timespan, nullable - l'intervallo di tempo successivo per elaborare questo record.

Per scoprire quali sono i record necessari per un aggiornamento in cui si esegue una query rispetto alla data corrente.

Quando elabori il record usi il database o il sistema data / ora del software se non è nulla, allora aggiungi recurs a due , riscrivi la tua prossima data di scadenza e tutto ciò che non ti serve aggiornare ancora una volta null .

    
risposta data 29.11.2014 - 10:46
fonte

Leggi altre domande sui tag