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: