CodeGym /Corsi /SQL SELF /Lavorare con Unix-time: EPOCH

Lavorare con Unix-time: EPOCH

SQL SELF
Livello 32 , Lezione 1
Disponibile

Unix-time è semplicemente un modo per rappresentare il tempo come il numero di secondi (a volte millisecondi) passati dalla mezzanotte del 1 gennaio 1970 in UTC. Questo formato è super popolare nello sviluppo: è facile da salvare, trasmettere e confrontare, perché è solo un numero.

Per dirla semplice, Unix-time è come un timer che ha iniziato a ticchettare nel 1970 e non si è mai fermato. Vedi un numero strano tipo 1697222400? Non ti spaventare — è solo quanti secondi sono passati dall'inizio del conteggio. Vuoi capire che data è? Tra poco impariamo a calcolarlo!

Questo formato viene spesso usato per sincronizzare dati tra sistemi, per salvare timestamp e quando serve confrontare velocemente cosa è successo prima e cosa dopo.

Conversione in Unix-time

In PostgreSQL c'è una funzione speciale EXTRACT(EPOCH FROM ...) che ti permette di convertire una data o un timestamp in Unix-time.

Convertiamo la data attuale in questo formato:

SELECT EXTRACT(EPOCH FROM NOW());

Il risultato sarà qualcosa tipo:

1697222400

Questo risultato è semplicemente la data e ora attuale in secondi dal 1970.

Ecco come puoi convertire una data fissa:

SELECT EXTRACT(EPOCH FROM TIMESTAMP '2023-10-01 12:00:00');

Risultato:

1696152000

Ora sappiamo che il 1 ottobre 2023 alle 12:00 UTC corrisponde a questo valore.

Conversione da Unix-time

Ovviamente, c'è anche la funzione inversa. Se hai un Unix-time e vuoi convertirlo in un formato leggibile, ti aiuta la funzione TO_TIMESTAMP().

Convertiamo Unix-time in data e ora

SELECT TO_TIMESTAMP(1697222400);

Risultato:

2023-10-13 00:00:00+00

Ora vediamo che questa è la data 13 ottobre 2023 alle 00:00 UTC.

Uso pratico di Unix-time

Supponiamo di avere una tabella events dove salviamo info sugli eventi, incluse le loro timestamp in formato Unix-time.

CREATE TABLE events (
    id SERIAL PRIMARY KEY,
    event_name TEXT,
    event_time BIGINT -- per salvare Unix-time
);

Possiamo inserire dati in questa tabella specificando i timestamp in formato Unix-time:

INSERT INTO events (event_name, event_time)
VALUES
('Avvio server', 1697222400),
('Aggiornamento database', 1697308800);

Per convertire queste info in formato leggibile, basta usare TO_TIMESTAMP:

SELECT event_name, TO_TIMESTAMP(event_time) AS readable_time
FROM events;

Risultato:

event_name readable_time
Avvio server 2023-10-13 00:00:00+00
Aggiornamento database 2023-10-14 00:00:00+00

Consigli ed errori tipici

  1. Scelta sbagliata della precisione

Se il tuo formato Unix-time ha i millisecondi (tipo 1697222400000), non puoi semplicemente passarlo a TO_TIMESTAMP o usare EXTRACT. In questi casi devi dividere il valore per 1000:

SELECT TO_TIMESTAMP(1697222400000 / 1000);

Risultato:

2023-10-13 00:00:00+00
  1. Ignorare i fusi orari

Unix-time è in UTC, quindi i risultati saranno sempre senza considerare il fuso orario, a meno che non converti esplicitamente l'orario. Per esempio:

SELECT TO_TIMESTAMP(1697222400) AT TIME ZONE 'Europe/Moscow';

Risultato:

2023-10-13 03:00:00
  1. Problemi con numeri troppo grandi

A volte capita che per sbaglio passi un valore Unix-time troppo grande (tipo millisecondi invece di secondi). Questo porta a risultati sbagliati:

SELECT TO_TIMESTAMP(1697222400000); -- Sarà errore!

Per sistemare, devi dividere il numero per 1000.

Esempio: calcolo del tempo di esecuzione di un task

Prendiamo un esempio reale: abbiamo una tabella di task tasks e vogliamo calcolare quanto tempo è passato dalla creazione di ogni task.

Creiamo la tabella:

CREATE TABLE tasks (
    id SERIAL PRIMARY KEY,
    task_name TEXT,
    created_at TIMESTAMP DEFAULT NOW()
);

Aggiungiamo qualche task:

INSERT INTO tasks (task_name)
VALUES
('Task 1'),
('Task 2'),
('Task 3');

Ora possiamo aggiungere una colonna con Unix-time:

SELECT id, task_name, EXTRACT(EPOCH FROM created_at) AS created_epoch
FROM tasks;

Risultato:

id task_name created_epoch
1 Task 1 1697222400
2 Task 2 1697233200

E calcoliamo quanto tempo è passato dalla creazione in secondi:

SELECT id, task_name, EXTRACT(EPOCH FROM NOW()) - EXTRACT(EPOCH FROM created_at) AS elapsed_seconds
FROM tasks;

Risultato:

id task_name elapsed_seconds
1 Task 1 3600
2 Task 2 7200

Quando e perché usare Unix-time?

Unix-time è perfetto per salvare dati temporali quando devi trasferire valori tra sistemi, confrontare timestamp e in altri casi dove serve il minimo carico sulla CPU. È usatissimo in API, sviluppo web, analytics, e anche per sincronizzare app server e client. Però occhio alle sue particolarità: è UTC-centrico, può essere in secondi o millisecondi, e il formato di salvataggio può cambiare.

Se ti capita di dover integrare sistemi esterni che "parlano il linguaggio Unix-time", ora sai come gestirlo in PostgreSQL. Usa senza paura TO_TIMESTAMP e EXTRACT(EPOCH) per convertire avanti e indietro, e tutti i tuoi problemi temporali saranno risolti!

Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION