Το πρόβλημα με τον τύπο timestamp χωρίς ζώνη ώρας

Στην PostgreSQL, η διάκριση μεταξύ timestamp και timestamptz είναι κρίσιμη. Ενώ το timestamptz αποθηκεύει μια απόλυτη χρονική στιγμή, το timestamp (χωρίς ζώνη ώρας) είναι ουσιαστικά μια «αφηρημένη» έννοια χρόνου. Η χρήση του δεύτερου για την αποθήκευση χρόνου UTC αποτελεί γνωστό σημείο συμφόρησης (bottleneck) και πηγή σφαλμάτων, καθώς δεν περιέχει πληροφορίες για τη ζώνη ώρας, καθιστώντας τις συγκρίσεις με πραγματικά χρονικά σημεία προβληματικές.

Η παγίδα του AT TIME ZONE

Όταν εφαρμόζουμε AT TIME ZONE 'UTC' σε μια στήλη timestamptz, η PostgreSQL δεν αλλάζει απλώς την αναπαράσταση, αλλά μετατρέπει τον τύπο δεδομένων σε timestamp. Αυτό δημιουργεί μια «παγίδα» (footgun) κατά τη σύγκριση με άλλες τιμές timestamptz. Επειδή η βάση δεδομένων θεωρεί ότι συγκρίνει δύο διαφορετικούς τύπους, η ισότητα επιστρέφει σχεδόν πάντα false, ακόμα και αν οι χρονικές στιγμές ταυτίζονται.

Υπολογισμοί διαστημάτων και η ανάγκη για διπλή μετατροπή

Το πρόβλημα γίνεται εντονότερο κατά τη χρήση INTERVAL για υπολογισμούς, όπως η εύρεση διαφορών μεταξύ μηνών. Επειδή η προσθήκη διαστημάτων επηρεάζεται από τη ζώνη ώρας του server, η μετατροπή σε UTC είναι επιβεβλημένη. Ωστόσο, για να διατηρηθεί ο τύπος timestamptz και να λειτουργήσουν σωστά οι συγκρίσεις, πρέπει να εφαρμόσουμε τον τελεστή δύο φορές:

((b.month_start AT TIME ZONE 'UTC') + INTERVAL '1 months') AT TIME ZONE 'UTC'

Αυτή η προσέγγιση διασφαλίζει ότι ο υπολογισμός γίνεται σε UTC, ενώ το τελικό αποτέλεσμα επιστρέφει στον τύπο timestamptz, αποκαθιστώντας τη διαλειτουργικότητα (interoperability) με τις υπόλοιπες στήλες του πίνακα.