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 sessió amb Google per llegir la pàgina completa.
Inicia sessió amb GoogleAmb qualsevol compte de Google. Només et demanarem que acceptis les condicions del servei.