Re: [postgresql-it] Presentazioni e problema: selezione 'parziale' per campo date
- From: Daniele Varrazzo <piro@xxxxxxxxxxx>
- To: postgresql-it <postgresql-it@xxxxxxxxxxxxx>
- Date: Thu, 29 Nov 2007 00:18:35 +0100
Guido Cauli ha scritto:
Innanzitutto salve a tutti,
mi chiamo Guido e sono un newbie di postgresql.
Ciao, benvenuto :)
Lo sto utilizzando a lavoro come supporto dati per Zope/Plone (con
piuttostol'adattatore ZPsycopgDA) e mi ci trovo piuttosto bene, anche se
lo trovo (ancora) un po' macchinoso per certi versi :S
Per giungere al punto, il problema è il seguente:
Ho una tabella con un campo tipo date(YYYY/MM/DD) da cui mi serve
selezionare dei dati, e dovrei strutturare la select in modo tale da
agire su tale campo in modo anche parziale, ovvero potendo indicare non
solo una data specifica ( p.es. "select [campi] from
[tabella] where date = '2007/11/24' " ) ma anche una data parziale
(ovvero solo anno e mese, o anche solo l'anno, come per dire "select
[campi] from [tabella] where date = '2007/11/??', giusto per spiegarmi a
livello logico ").
Molti mi hanno parlato bene della flessibilità di postgresql riguardo le
funzionalità di date/time, ma fino ad ora non sono riuscito a risolvere
il problema traducendolo in una query adeguata.
E' possibile "parzializzare" un campo date?
Non credo sia possibile fare una query per anno o per mese, ma è facile
simularle con query per periodi. Per esempio, dove vorresti usare (informalmente):
...WHERE date = '2007-11-??'
puoi usare equivalentemente (e questo funziona) l'espressione:
...WHERE date >= '2007-11-01'::date
AND date < '2007-11-01'::date + '1 month'::interval;
che funziona sempre bene, indipendentemente dalla lunghezza del mese, come
puoi verificare con:
-- (mese di 30 giorni)
=> select '2007-11-01'::date + '1 month'::interval;
?column?
---------------------
2007-12-01 00:00:00
(1 row)
-- (mese di 31 giorni)
=> select '2007-10-01'::date + '1 month'::interval;
?column?
---------------------
2007-11-01 00:00:00
(1 row)
-- (mese di 28 giorni)
=> select '2007-02-01'::date + '1 month'::interval;
?column?
---------------------
2007-03-01 00:00:00
(1 row)
-- (mese di 29 giorni)
=> select '2000-02-01'::date + '1 month'::interval;
?column?
---------------------
2000-03-01 00:00:00
(1 row)
In
http://www.postgresql.org/docs/8.2/static/datatype-datetime.html#AEN4903
trovi i diversi modi in cui poter esprimere un intervallo, che ti possono
servire per generare intervalli diversi.
Non conosco bene ZPsycopgDA (ma conosco bene psycopg "puro"), ma penso tu
possa usare un segnaposto tipo '%s' (o '%(nome)s' se ti serve non posizionale)
nella query string e passare a questa un oggetto date Python per farlo
trasformare dal driver nella giusta rappresentazione stringa della data.
A presto, ciao!
--
Daniele Varrazzo - Develer S.r.l.
http://www.develer.com
Other related posts: