Dates
SQLite no té cap tipus per a les dates: les guarda com a text, i tu les talles, les compares i les restes amb funcions.
Introducció
Ja has fet servir strftime dues vegades sense que ningú te l’expliqués.
A Where, per triar els pagaments d’un dia concret.
A Group by, per agrupar-los per mes.
Les dues vegades has hagut d’embolicar la columna amb una funció abans de fer-hi res.
Aquesta pàgina és el perquè.
Entorn de treball
Continues amb sakila.db, el catàleg del videoclub de Where.
Hi tens dues taules amb dates:
payment, amb la data de cada pagament apayment_date.rental, amb la del lloguer arental_datei la de la devolució areturn_date.
Una data és text
A Where vas veure que amb sakila no calia cap cast, perquè les seves columnes tenen tipus declarats.
payment_date està declarada timestamp.
Mira de quin tipus és de debò:
select payment_date, typeof(payment_date) as tipus
from payment
limit 1;| payment_date | tipus |
|---|---|
| 2005-05-25 11:30:37.000 | text |
Text.
SQLite no té cap tipus per a les dates. No n’hi ha cap.
Té cinc tipus i cap és una data: null, integer, real, text i blob.
Pots escriure timestamp, date o datetime al create table, i SQLite t’ho accepta, però el que hi guarda és text.
Per què el format importa
Si una data és text, l’ordre alfabètic és l’únic ordre que SQLite en sap.
I amb el format AAAA-MM-DD l’ordre alfabètic i l’ordre cronològic són el mateix.
select date(rental_date) as dia, count(*) as lloguers
from rental
group by dia
order by dia desc
limit 3;| dia | lloguers |
|---|---|
| 2006-02-14 | 182 |
| 2005-08-23 | 598 |
| 2005-08-22 | 626 |
Ordenat com a text, i tot i així el darrer dia surt primer.
Ara mira què passa amb el format d’aquí, DD-MM-AAAA:
select distinct strftime('%d-%m-%Y', rental_date) as dia
from rental
order by dia
limit 5;Estàs llegint una vista prèvia.
Inicia la sessió amb Google per llegir la pàgina sencera.
Inicia la sessió amb GoogleNomés et demanarem que acceptis les condicions del servei.