Date & Time
25 Functions
Date and Time functions allow you to handle temporal dataβfrom tracking when a user last logged in to calculating complex project deadlines. In PostgreSQL, these functions are essential for any data analyst or backend developer working with logs, schedules, or historical records.
Table of Contents
NOW()
Returns the current date and time (with time zone).
NOW()Recording the exact moment a transaction or a "Quest" is completed.
SELECT NOW();Dalam transaksi yang panjang, NOW() akan selalu mengembalikan waktu yang sama (awal transaksi). Gunakan CLOCK_TIMESTAMP() jika butuh waktu yang benar-benar aktual di setiap baris.
CURRENT_DATE
Returns the current date without the time component.
CURRENT_DATEGenerating a daily report or filtering orders made "today."
SELECT * FROM orders WHERE order_date = CURRENT_DATE;Ini adalah cara paling efisien untuk membandingkan tanggal saja tanpa perlu melakukan casting atau pembersihan waktu secara manual.
CURRENT_TIME
Returns the current time (with time zone) without the date.
CURRENT_TIMEChecking if a store is currently open or tracking specific login hours.
SELECT CURRENT_TIME;Kamu bisa menentukan presisi detiknya, misalnya CURRENT_TIME(0) untuk membuang milidetik.
LOCALTIMESTAMP
Returns the current date and time without time zone information.
LOCALTIMESTAMPStoring time for a local event where time zone offsets aren't required.
SELECT LOCALTIMESTAMP;Untuk aplikasi global seperti XQLora, disarankan tetap menggunakan TIMESTAMPTZ agar waktu user di berbagai negara tetap akurat.
EXTRACT()
Retrieves sub-fields (like year, month, day) from a date/time value.
EXTRACT(field FROM source)Finding which day of the week (DOW) gets the most "Arena" matches.
SELECT EXTRACT(HOUR FROM created_at) FROM users;Gunakan EXTRACT(DOW FROM date) untuk mendapatkan hari (0 = Sunday). Ini sangat berguna untuk analisis perilaku mingguan user.
DATE_PART()
A legacy/alternative way to extract sub-fields, returning a double precision value.
DATE_PART('field', source)Similar to EXTRACT, often used for mathematical operations on dates.
SELECT DATE_PART('year', NOW());EXTRACT lebih standar SQL, sementara DATE_PART lebih spesifik ke gaya PostgreSQL/Informix. Keduanya bekerja sangat mirip di Postgres.
DATE_TRUNC()
Truncates a timestamp to a specified level of precision (e.g., to the nearest month).
DATE_TRUNC('precision', source)Aggregating total XP earned by month.
SELECT DATE_TRUNC('month', created_at), SUM(xp)FROM achievementsGROUP BY 1;Ini adalah "senjata rahasia" untuk membuat time-series reports. Semua waktu di bulan yang sama akan dipaksa menjadi tanggal 1 jam 00:00:00.
AGE()
Calculates the difference between two timestamps and returns it as an interval (Years, Months, Days).
AGE(timestamp1, timestamp2)Calculating how long a user has been a member of XQLora.
SELECT AGE(NOW(), joined_at) FROM users;Jika hanya satu argumen yang diberikan (misal AGE(timestamp)), fungsi ini otomatis membandingkannya dengan tanggal hari ini.
TO_CHAR()
Converts a timestamp to a string using a custom format.
TO_CHAR(source, 'format')Displaying "Joined on Monday, 20 Jan 2026" on the user profile.
SELECT TO_CHAR(NOW(), 'Day, DD Mon YYYY');Format 'FMDay' (Fill Mode) sangat berguna untuk menghapus spasi kosong yang biasanya muncul di akhir nama hari.
TO_DATE()
Converts a string to a date value.
TO_DATE(string, 'format')Parsing user-provided text inputs into actual database dates.
SELECT TO_DATE('2026/02/11', 'YYYY/MM/DD');Pastikan format string cocok persis dengan pola yang kamu berikan agar tidak terjadi error konversi.
TO_TIMESTAMP()
Converts a string or a Unix epoch number to a timestamp.
TO_TIMESTAMP(string/number, 'format')Converting a timestamp from an external API (often in Unix seconds) to a Postgres timestamp.
SELECT TO_TIMESTAMP(1739274000);Sangat krusial saat melakukan migrasi data atau integrasi dengan data JavaScript/Node.js yang sering menggunakan format epoch.
MAKE_DATE()
Creates a date from Year, Month, Day integers.
MAKE_DATE(year, month, day)Generating dates programmatically.
SELECT MAKE_DATE(2026, 2, 11);Berguna saat data tanggal tersimpan di kolom terpisah (year, month, day) dan perlu digabungkan.
MAKE_TIME()
Creates a time from Hour, Min, Sec.
MAKE_TIME(hour, min, sec)Setting specific event hours.
SELECT MAKE_TIME(14, 30, 0);Parameter detik menerima double precision, jadi kamu bisa membuat waktu dengan presisi milidetik.
MAKE_TIMESTAMP()
Creates a full timestamp from components.
MAKE_TIMESTAMP(year, month, day, hour, min, sec)Combining separate date/time columns.
SELECT MAKE_TIMESTAMP(2026, 2, 11, 14, 30, 0);Gunakan MAKE_TIMESTAMPTZ jika kamu membutuhkan timestamp yang sadar timezone.
INTERVAL
Adds/subtracts time (e.g., + interval '1 day') for date arithmetic.
timestamp + INTERVAL 'value unit'Calculating expiration dates for 7-day trials.
-- Add 7 days to current dateSELECT NOW() + INTERVAL '7 days';-- Subtract 1 monthSELECT NOW() - INTERVAL '1 month';INTERVAL bisa dikombinasikan: INTERVAL '1 year 2 months 3 days'. Sangat fleksibel untuk kalkulasi durasi kompleks.
AT TIME ZONE
Converts a timestamp to a different time zone.
timestamp AT TIME ZONE 'zone'Displaying local time for global users.
SELECT NOW() AT TIME ZONE 'Asia/Jakarta';Untuk user Indonesia (WIB), gunakan 'Asia/Jakarta'. Untuk WITA gunakan 'Asia/Makassar', dan WIT gunakan 'Asia/Jayapura'.
LOCALTIME
Same as CURRENT_TIME but without timezone.
LOCALTIMELocal logging without offsets.
SELECT LOCALTIME;Cocok untuk aplikasi yang hanya berjalan di satu timezone dan tidak perlu konversi.
ISFINITE()
Checks if a date is not 'infinity' or '-infinity'.
ISFINITE(date/timestamp/interval)Validating historical or future-bound data.
SELECT ISFINITE(DATE '2026-02-11'); -- trueSELECT ISFINITE(DATE 'infinity'); -- falsePostgreSQL mendukung nilai 'infinity' dan '-infinity' untuk tanggal. Fungsi ini membantu memfilter data yang valid.
DATE_BIN()
"Bins" timestamps into fixed intervals (e.g., 5-min buckets).
DATE_BIN(stride, source, origin)Advanced analytics for high-frequency logs.
SELECT DATE_BIN('5 minutes', created_at, TIMESTAMP '2026-01-01')FROM events;Lebih fleksibel dari DATE_TRUNC karena bisa membuat bucket dengan interval non-standar seperti 15 menit atau 2 jam.
CLOCK_TIMESTAMP()
Current time that advances during a transaction.
CLOCK_TIMESTAMP()Accurate measurement of long-running queries.
SELECT CLOCK_TIMESTAMP();Berbeda dengan NOW() yang "beku" selama transaksi, CLOCK_TIMESTAMP() selalu mengembalikan waktu terkini.
STATEMENT_TIMESTAMP()
Time at which the current statement started.
STATEMENT_TIMESTAMP()Auditing query execution start times.
SELECT STATEMENT_TIMESTAMP();Berguna untuk profiling: bandingkan STATEMENT_TIMESTAMP() di awal dan CLOCK_TIMESTAMP() di akhir query untuk mengukur durasi.
TRANSACTION_TIMESTAMP()
Synonymous with NOW() β returns transaction start time.
TRANSACTION_TIMESTAMP()Standard transaction-safe timing.
SELECT TRANSACTION_TIMESTAMP();Secara teknis identik dengan NOW(). Nama ini lebih eksplisit tentang perilakunya.
JUSTIFY_DAYS()
Adjusts interval so 30 days = 1 month.
JUSTIFY_DAYS(interval)Cleaning up messy interval results.
SELECT JUSTIFY_DAYS(INTERVAL '45 days');-- Result: 1 mon 15 daysMengubah interval "mentah" menjadi format yang lebih bisa dibaca manusia.
JUSTIFY_HOURS()
Adjusts interval so 24 hours = 1 day.
JUSTIFY_HOURS(interval)Normalizing duration data for reports.
SELECT JUSTIFY_HOURS(INTERVAL '50 hours');-- Result: 2 days 02:00:00Sempurna untuk dashboard yang menampilkan durasi aktivitas user dalam format hari + jam.
JUSTIFY_INTERVAL()
Combination of justify_days and justify_hours.
JUSTIFY_INTERVAL(interval)Getting the cleanest "Human Readable" duration.
SELECT JUSTIFY_INTERVAL(INTERVAL '1 month -1 hour');-- Result: 29 days 23:00:00Fungsi "all-in-one" yang menggabungkan JUSTIFY_DAYS dan JUSTIFY_HOURS untuk menghasilkan interval paling rapi.