Cara Membuat Timestamp String Last Ago di PostgreSQL

  • 3 min read
  • Jan 18, 2023
PosgreSQL database - Etalastok

Kali ini saya akan membahas sedikit teknis ya gaes, mengenai pembuatan sebuah fitur yang biasa kita lihat yang menurut saya fitur ini tidak terlalu terlihat tapi sangat fungsional dan bermanfaaaaaaat banget buat pengguna aplikasi atau website ya.

Nama fiturnya yaitu “Timestamp String Last Ago”. Seriusan itu nama saya yang ngarang sendiri (*ehhehe) bingung juga fitur apa sebenarnya dan gak tau apakah ada nama formalnya atau enggak ada. jika ada temen2 yang tau silahkan komen dibawah ya gaes.

Suka liat kan seperti di aplikasi Gmap bagian jadwal kereta, di timeline medsos seperti Instagram, Facebook, atau aplikasi-aplikasi yang menampilkan data waktu secara realtime. akan saya tampilkan screenshot dibawah untuk lebih detailnya.

atau di beberapa website aplikasi berikut ini:

Jadi bagaimana cara membuat “just now”, “a few ago”, “a minute ago” dsb disebuah aplikasi atau website? Untuk membuat fitur ini saya membuat sebuah function menggunakan PostgreSQL, simak pembahasannya seperti dibawah.

Apa itu PostgreSQL?

PostgreSQL adalah sebuah program RDBMS (Relational Database Management System) yang bersifat opensource atau bebas digunakan dan dikembangkan yang berfungsi untuk mengolah data menggunakan perintah SQL. Temen2 bisa baca selengkapnya tentang postgreSQl di wikipedia (https://en.wikipedia.org/wiki/PostgreSQL).

Sebelum mempelajari PostgreSQL ini, temen2 juga wajib tau soal apa itu SQL (Structure Query Language) dan cara penulisan dalam membaca atau memanipulasi sebuah data (DDL/DML).

Membuat SQL timestamp string Last Ago di PostgreSQL

BEGIN
RETURN (
select CASE WHEN split_part((select now()::timestamp - date_point::timestamp)::text,':',1) ilike '%days%'
THEN
substring(split_part((select now()::timestamp - date_point::timestamp)::text,':',1),1,2) ||' hari yang lalu'

    WHEN (split_part((select now()::timestamp - date_point::timestamp)::text,':',1)::int) > 0 then
        split_part((select now()::timestamp - date_point::timestamp)::text,':',1)::int ||' jam ' 
        || split_part((select now()::timestamp - date_point::timestamp)::text,':',2)::int ||' menit yang lalu'
    ELSE 
        split_part((select now()::timestamp - date_point::timestamp)::text,':',2)::int ||' menit yang lalu'
    END as duration
);
END;

Penjelasan function SQL diatas

Mari kita bahas bagian-bagian dari functionSQL diatas: Query terdiri dari beberapa kondisional menggunakan CASE WHEN. Logikanya seperti ini:

  1. kita kurangi antara 2 timestamp (waktu sekarang dan titik waktu),
  2. jika hasilnya mengandung kata “days’ maka kata tsb kita ganti jadi “hari yang lalu”,
  3. jika hasilnya integer (lebih dari 0), maka kita ambil jam dan menit lalu kita gabungkan
  4. selain itu kita ambil menit dan gabungkan kata “menit yang lalu

Didalam kondisional pertama kita menggunakan pengurangan antara 2 timestamp dan variable date_point untuk parameter titik waktunya, seperti berikut:

select now()::timestamp - '2023-01-01'::timestamp
result: 17 days 11:09:19.454741

Setelah itu kita akan mencari kata “days” di hasil tersebut. Caranya saya split string menggunakan fungsi SPLIT_PART() untuk memisahkan string menggunakan “:” sebagai delimiternya dan mengambil index pertama, kemudian saya cocokan apakah mengandung kata “days” mengunakan keyword postgreSQL yaitu “ilike” query menjadi sbb:

split_part((select now()::timestamp - '2023-01-01'::timestamp)::text,':',1) ilike '%days%' 
result: 17 days 11

jika kondisi benar atau TRUE maka akan mengeksekusi query berikut :

substring(split_part((select now()::timestamp - '2023-01-01'::timestamp)::text,':',1),1,2) ||' hari yang lalu'
result: 3 hari yang lalu

dikondisional kedua hampir sama yaitu mencocokan apakah hasilnya tidak mengandung kata “days” dan merupakan integer, maka akan menampilkan waktu dan menit yang digabungkan, query nya sbb:

(split_part((select now()::timestamp - date_point::timestamp)::text,':',1)::int) > 0 then
            split_part((select now()::timestamp - date_point::timestamp)::text,':',1)::int ||' jam ' 
            || split_part((select now()::timestamp - date_point::timestamp)::text,':',2)::int ||' menit yang lalu'
result: 3 jam 45 menit yang lalu

kemudian terakhir itu kondisional untuk hasil dari pengurangan waktu belum lama atau beberapa waktu lalu, query nya sbb:

 split_part((select now()::timestamp - date_point::timestamp)::text,':',2)::int ||' menit yang lalu'
result: 3 menit yang lalu

Mudah bukan?!, ini bisa kamu terapkan dan sesuaikan SQL nya tergantung DBMS apa yang digunakan, misalnya MySQL dengan logika yang sama.

Semoga dokumentasi ini bisa bermanfaat buat temen2, jika ada yang tidak jelas bisa ditanya di kolom komentar dibawah.

Post Terkait :

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *