(Today()-datanasc)/365
3 partecipanti
Pagina 1 di 1
(Today()-datanasc)/365
Cari Maestri,
(Today()-datanasc)/365
sappiamo che calcola l'età del paziente.
Ma supponiamo di voler calcolare l'età del paziente nel momento in cui abbiamo effettuato un dato accertamento?
Per esempio, volendo sapere l'età del paziente al momento della rilevazione del BMI, pensavo che potesse funzionare
(datavisita-datanasc)/365 che però non calcola l'età correttamente e non riesco a capire perché...
per me, che sono nato il 13/12/63, fino al 30 novembre assegna 47 anni, già il primo dicembre mi fa più vecchio di uno assegnandomene 48
Pensavo potesse funzionare anche
(Max(datavisita)-datanasc)/365 ma questa non va proprio.
(Today()-datanasc)/365
sappiamo che calcola l'età del paziente.
Ma supponiamo di voler calcolare l'età del paziente nel momento in cui abbiamo effettuato un dato accertamento?
Per esempio, volendo sapere l'età del paziente al momento della rilevazione del BMI, pensavo che potesse funzionare
(datavisita-datanasc)/365 che però non calcola l'età correttamente e non riesco a capire perché...
per me, che sono nato il 13/12/63, fino al 30 novembre assegna 47 anni, già il primo dicembre mi fa più vecchio di uno assegnandomene 48
Pensavo potesse funzionare anche
(Max(datavisita)-datanasc)/365 ma questa non va proprio.
Re: (Today()-datanasc)/365
Ci sono vari modi per calcolare l'età:
Days(today()-datanasc)/365 oppure Days(datanasc, today())/365
Entrambe le formule calcolano il numero di giorni tra le due date e dividono il totale per 365, ma poiché l'anno non è di 365 giorni ma 365,25 ecco la differenza, quindi dovrebbe essere: Days(datanasc, today())/365.25 ma si otterrebbe un'età con i decimali e quindi bisognerebbe arrotondare per difetto, cioé: FLOOR(Days(datanasc, today())/365.25). Ciò complica le cose.
Io preferisco usare la formula: Years(datanasc, today()) che è più semplice e più precisa.
E' possibile calcolare la differenza tra due date quando sono dei valori univoci, Max(datavisita) non è un valore univoco. Con MAX(campo) si indica il valore massimo tra un insieme di valori omogenei, ma datavisita a quale data si riferisce? l'ultimo accesso alla scheda del paziente. la data più recente di prescrizione di un dato accertamento o di misurazione di pressione, ecc. ? In un post precedente già si è discusso di questo, per indicare un valore più recente non è sufficiente indicare Max(datavisita), ma bisogna calcolare la data corrispondemte all'ultimo valore inserito quando si esclude un valore analgo inseito in data successiva.
Ricorderai la selezione per indicare la data dell'ultimo BMI:
(Select Max(a.data_open) From cart_accert a Where (a.codice = p.codice And a.ac_code Like '2609' And ac_val Is Not Null) And Not Exists (Select a1.codice From cart_accert a1 Where a1.codice = a.codice And a1.ac_code Like '2609' And (a1.data_open > a.data_open Or (a1.data_open = a.data_open And a1.rowid > a.rowid)) And a1.ac_val Is Not Null)) _Data_BMI_,
Days(today()-datanasc)/365 oppure Days(datanasc, today())/365
Entrambe le formule calcolano il numero di giorni tra le due date e dividono il totale per 365, ma poiché l'anno non è di 365 giorni ma 365,25 ecco la differenza, quindi dovrebbe essere: Days(datanasc, today())/365.25 ma si otterrebbe un'età con i decimali e quindi bisognerebbe arrotondare per difetto, cioé: FLOOR(Days(datanasc, today())/365.25). Ciò complica le cose.
Io preferisco usare la formula: Years(datanasc, today()) che è più semplice e più precisa.
E' possibile calcolare la differenza tra due date quando sono dei valori univoci, Max(datavisita) non è un valore univoco. Con MAX(campo) si indica il valore massimo tra un insieme di valori omogenei, ma datavisita a quale data si riferisce? l'ultimo accesso alla scheda del paziente. la data più recente di prescrizione di un dato accertamento o di misurazione di pressione, ecc. ? In un post precedente già si è discusso di questo, per indicare un valore più recente non è sufficiente indicare Max(datavisita), ma bisogna calcolare la data corrispondemte all'ultimo valore inserito quando si esclude un valore analgo inseito in data successiva.
Ricorderai la selezione per indicare la data dell'ultimo BMI:
(Select Max(a.data_open) From cart_accert a Where (a.codice = p.codice And a.ac_code Like '2609' And ac_val Is Not Null) And Not Exists (Select a1.codice From cart_accert a1 Where a1.codice = a.codice And a1.ac_code Like '2609' And (a1.data_open > a.data_open Or (a1.data_open = a.data_open And a1.rowid > a.rowid)) And a1.ac_val Is Not Null)) _Data_BMI_,
Giuseppe- Moderatore
- Messaggi : 90
Punti : 4905
Voti per importanza dei messaggi : 22
Data d'iscrizione : 20.02.11
Età : 67
Località : CASERTA
Re: (Today()-datanasc)/365
In effetti puo' esistere una marginale discrepanza fra le varie formule utilizzate per calcolare l' età, in quanto la durata dell' anno astronomico considerato ( quale : siderale , tropicale, gaussiano , lunare , ... , ) è approssimata in modo lievemente diverso .
Ad esempio per calcolare l' età dei pazienti , è possibile usare :
Cast( DateDiff ( dd, nascita , Today())/365.25 As Integer) As eta,
oppure in alternativa
(DateDiff ( hh, nascita , Today())/8766) As eta,
Ad esempio per calcolare l' età dei pazienti Vaccinabili per l' Influenza , utilizzo :
Cast( Days(p.nascita, '2011/12/31')/365.25 As Integer)
oppure
DateDiff ( hh, p.nascita, '2011/12/31') /8766
ed in modo analogo per estrarre il BMI :
Select Cast(cognome As Char(18)), nome, sesso, nascita,
Cast( DateDiff ( dd, nascita , Today())/365.25 As Integer) As eta, ' ',
(Select Max(a.data_open) From cart_accert a Where a.codice = p.codice And a.ac_code Like '2609' And ac_val Is Not Null And a.codice Not IN (Select codice From cart_problemi l Where l.codice = a.codice And cp_code Like 'V22%' And (a.data_open Between l.data_open+61 And l.data_open+340 )) And Not Exists (Select a1.codice From cart_accert a1 Where a1.codice = a.codice And a1.ac_code Like '2609' And a1.codice Not IN (Select codice From cart_problemi l Where l.codice = a1.codice And cp_code Like 'V22%' And (a1.data_open Between l.data_open+61 And l.data_open+340 )) And (a1.data_open > a.data_open Or (a1.data_open = a.data_open And a1.rowid > a.rowid)) And a1.ac_val Is Not Null))
_Bmi_d_,
(DateDiff ( hh, nascita , _Bmi_d_)/8766) _eta_Bmi_,
(Select Cast(Max(a.ac_val) As Dec(4,1)) From cart_accert a Where a.codice = p.codice And ac_des Like '%BMI%' And a.data_open = _bmi_d_ )
_Bmi_v_,
(Select Cast(Max(a.ac_val) As Dec(4,1)) From cart_accert a Where a.codice = p.codice And ac_des Like 'Peso' And a.data_open = _bmi_d_ )
_Peso_,
(Select Cast(Max(a.ac_val) As Dec(4,1)) From cart_accert a Where a.codice = p.codice And ac_des Like 'Altezza' And a.data_open = _bmi_d_ )
_Altezza_,
(IF _bmi_v_< 20 And p.sesso = 'M' Then ' SottoPeso ' Else IF _bmi_v_< 19 And p.sesso = 'F' Then ' SottoPeso ' Else IF _bmi_v_ Between 20 And 24.9 And p.sesso = 'M' Then ' NormoPeso ' Else IF _bmi_v_ Between 19 And 24.9 And p.sesso = 'F' Then ' NormoPeso ' Else IF _bmi_v_ Between 25 And 29.9 Then ' Sovrappeso ' Else IF _bmi_v_ Between 30 And 34.9 Then ' Obesità I ' Else IF _bmi_v_ Between 35 And 39.9 Then ' Obesità II ' Else IF _bmi_v_ > 39.9 Then ' Obesità III ' Else ' ? ' Endif Endif Endif Endif Endif Endif Endif Endif )
As Diagnosi, Today() As DataQuery
FROM pazienti p INNER JOIN nos_002 n ON p.codice = n.codice
Where eta >19.9 And _Bmi_v_ > 14.9
And n.pa_medi Like '%' And p.pa_convenzione = 'S' And (n.pa_drevoca Is Null Or n.pa_drevoca > Today() Or (n.pa_drevoca Between Today()-365 And Today() And motivo_revoca ='S' ))
Order By 7, 1, 2
Varie sono le opzioni possibili con la formula DATEDIFF : giorni , ore , minuti , secondi , ... .
Un saluto da Sergio Tomasini , Orzivecchi ( BS )
Ad esempio per calcolare l' età dei pazienti , è possibile usare :
Cast( DateDiff ( dd, nascita , Today())/365.25 As Integer) As eta,
oppure in alternativa
(DateDiff ( hh, nascita , Today())/8766) As eta,
Ad esempio per calcolare l' età dei pazienti Vaccinabili per l' Influenza , utilizzo :
Cast( Days(p.nascita, '2011/12/31')/365.25 As Integer)
oppure
DateDiff ( hh, p.nascita, '2011/12/31') /8766
ed in modo analogo per estrarre il BMI :
Select Cast(cognome As Char(18)), nome, sesso, nascita,
Cast( DateDiff ( dd, nascita , Today())/365.25 As Integer) As eta, ' ',
(Select Max(a.data_open) From cart_accert a Where a.codice = p.codice And a.ac_code Like '2609' And ac_val Is Not Null And a.codice Not IN (Select codice From cart_problemi l Where l.codice = a.codice And cp_code Like 'V22%' And (a.data_open Between l.data_open+61 And l.data_open+340 )) And Not Exists (Select a1.codice From cart_accert a1 Where a1.codice = a.codice And a1.ac_code Like '2609' And a1.codice Not IN (Select codice From cart_problemi l Where l.codice = a1.codice And cp_code Like 'V22%' And (a1.data_open Between l.data_open+61 And l.data_open+340 )) And (a1.data_open > a.data_open Or (a1.data_open = a.data_open And a1.rowid > a.rowid)) And a1.ac_val Is Not Null))
_Bmi_d_,
(DateDiff ( hh, nascita , _Bmi_d_)/8766) _eta_Bmi_,
(Select Cast(Max(a.ac_val) As Dec(4,1)) From cart_accert a Where a.codice = p.codice And ac_des Like '%BMI%' And a.data_open = _bmi_d_ )
_Bmi_v_,
(Select Cast(Max(a.ac_val) As Dec(4,1)) From cart_accert a Where a.codice = p.codice And ac_des Like 'Peso' And a.data_open = _bmi_d_ )
_Peso_,
(Select Cast(Max(a.ac_val) As Dec(4,1)) From cart_accert a Where a.codice = p.codice And ac_des Like 'Altezza' And a.data_open = _bmi_d_ )
_Altezza_,
(IF _bmi_v_< 20 And p.sesso = 'M' Then ' SottoPeso ' Else IF _bmi_v_< 19 And p.sesso = 'F' Then ' SottoPeso ' Else IF _bmi_v_ Between 20 And 24.9 And p.sesso = 'M' Then ' NormoPeso ' Else IF _bmi_v_ Between 19 And 24.9 And p.sesso = 'F' Then ' NormoPeso ' Else IF _bmi_v_ Between 25 And 29.9 Then ' Sovrappeso ' Else IF _bmi_v_ Between 30 And 34.9 Then ' Obesità I ' Else IF _bmi_v_ Between 35 And 39.9 Then ' Obesità II ' Else IF _bmi_v_ > 39.9 Then ' Obesità III ' Else ' ? ' Endif Endif Endif Endif Endif Endif Endif Endif )
As Diagnosi, Today() As DataQuery
FROM pazienti p INNER JOIN nos_002 n ON p.codice = n.codice
Where eta >19.9 And _Bmi_v_ > 14.9
And n.pa_medi Like '%' And p.pa_convenzione = 'S' And (n.pa_drevoca Is Null Or n.pa_drevoca > Today() Or (n.pa_drevoca Between Today()-365 And Today() And motivo_revoca ='S' ))
Order By 7, 1, 2
Varie sono le opzioni possibili con la formula DATEDIFF : giorni , ore , minuti , secondi , ... .
Un saluto da Sergio Tomasini , Orzivecchi ( BS )
Cervino- Membro Junior
- Messaggi : 245
Punti : 5043
Voti per importanza dei messaggi : 22
Data d'iscrizione : 03.03.11
Età : 69
Località : Orzivecchi (BS)
Re: (Today()-datanasc)/365
Carissimi,
Un grazie come sempre per l'aiuto.
A beneficio di tutti la seguente formula
Years(datanasc, datavisita) As eta_allla_rilevazione
funziona perfettamente per calcolare l'età del paziente al momento della rilevazione del dato, nel mio caso BMI.
Sto provando a riscrivere la query che è una SUMMA di tutti i vostri preziosi suggerimenti ed una volta terminata la pubblico per sottoporla al vostro giudizio che mi interessa molto.
Un grazie come sempre per l'aiuto.
A beneficio di tutti la seguente formula
Years(datanasc, datavisita) As eta_allla_rilevazione
funziona perfettamente per calcolare l'età del paziente al momento della rilevazione del dato, nel mio caso BMI.
Sto provando a riscrivere la query che è una SUMMA di tutti i vostri preziosi suggerimenti ed una volta terminata la pubblico per sottoporla al vostro giudizio che mi interessa molto.
Re: (Today()-datanasc)/365
Sul mio mille.db di riserva , rilevo che le formule meno attendibili per il calcolo dell' età sono :
(Years(nascita, Today())) ed in misura molto minore (Days(nascita, Today())/365)
mentre risultano parimenti affidabili ( almeno per un' età fino a 100 anni ) le formule :
(Floor( Days(nascita, Today())/365.25))
(DateDiff ( hh, nascita, Today())/8766)
Cast( DateDiff ( dd, nascita, Today())/365.25 As Integer)
Floor( DateDiff ( dd, nascita, Today())/365.25)
Sarà forse diverso il risultato, estraendo dalle viste ?
Domani verifichero' in studio, su un altro mille.db, se il comportamento delle formule è analogo .
Una saluto da Sergio Tomasini , Orzivecchi (BS)
(Years(nascita, Today())) ed in misura molto minore (Days(nascita, Today())/365)
mentre risultano parimenti affidabili ( almeno per un' età fino a 100 anni ) le formule :
(Floor( Days(nascita, Today())/365.25))
(DateDiff ( hh, nascita, Today())/8766)
Cast( DateDiff ( dd, nascita, Today())/365.25 As Integer)
Floor( DateDiff ( dd, nascita, Today())/365.25)
Sarà forse diverso il risultato, estraendo dalle viste ?
Domani verifichero' in studio, su un altro mille.db, se il comportamento delle formule è analogo .
Una saluto da Sergio Tomasini , Orzivecchi (BS)
Cervino- Membro Junior
- Messaggi : 245
Punti : 5043
Voti per importanza dei messaggi : 22
Data d'iscrizione : 03.03.11
Età : 69
Località : Orzivecchi (BS)
Re: (Today()-datanasc)/365
Cervino ha scritto:Sul mio mille.db di riserva , rilevo che le formule meno attendibili per il calcolo dell' età sono :
(Years(nascita, Today())) ed in misura molto minore (Days(nascita, Today())/365)
mentre risultano parimenti affidabili ( almeno per un' età fino a 100 anni ) le formule :
(Floor( Days(nascita, Today())/365.25))
(DateDiff ( hh, nascita, Today())/8766)
Cast( DateDiff ( dd, nascita, Today())/365.25 As Integer)
Floor( DateDiff ( dd, nascita, Today())/365.25)
Sarà forse diverso il risultato, estraendo dalle viste ?
Domani verifichero' in studio, su un altro mille.db, se il comportamento delle formule è analogo .
Una saluto da Sergio Tomasini , Orzivecchi (BS)
Riprovo meglio e poi ti faccio sapere, sto usando le viste, al momento mi sembra più semplice per imparare ma mi sto rendendo conto dei limiti (vedi post sul BMI le mie difficoltà per elencare al tempo stesso a chi è stato calcolato ed a chi non è stato calcolato il BMI), ho provato con due tre date la formula per calcolare l'età al momento della rilevazione
(Years(nascita, datatvisita)
e mi sembrava dare un risultato corretto.
Pagina 1 di 1
Permessi in questa sezione del forum:
Non puoi rispondere agli argomenti in questo forum.
|
|