Cara menggunakan timestamp to string postgresql

Halooo semuanya, pada postingan kali ini kita akan coba menghitung selisih antara dua waktu dengan tipe data timestamp di PostgreSQL.

Pada kasus ini, kita akan coba menghitung lama waktu dari sebuah pembangunan gedung.

Kita mempunyai sebuah tabel gedung dengan kolom yang berisi nama_gedung (varchar), waktu_mulai (timestamp) dan waktu_berakhir (timestamp).

Berikut isi data dari tabel tersebut

nama_gedungwaktu_mulaiwaktu_berakhirGedung A2021-01-01 09:30:002022-01-20 10:25:00Gedung B2022-01-20 11:00:002022-02-20 12:30:00Gedung C2022-01-20 09:25:002022-01-20 15:30:00

Cara 1 : Menampilkan dalam Hari, Jam, Menit dan Detik

Pada cara pertama kita dapat menampilkan selisih dari dua waktu menjadi hari, jam, menit dan detik

SELECT 
    *
    waktu_berakhir - waktu_mulai AS selisih
FROM gedung;

Hasilnya menjadi seperti berikut :

nama_gedungwaktu_mulaiwaktu_berakhirselisihGedung A2021-01-01 09:30:002022-01-20 10:25:0031 days 01:30:00Gedung B2022-01-20 11:00:002022-02-20 12:30:0006:05:00Gedung C2022-01-20 09:25:002022-01-20 15:30:00384 days 00:55:00

Cara 2 : Menampilkan dalam Tahun, Bulan, Hari, Jam, Menit dan Detik

Pada cara kedua kita dapat menampilkannya hingga menampilkan tahun dengan menggunakan fungsi AGE().

SELECT 
    *,
    AGE(waktu_berakhir,waktu_mulai) AS selisih
FROM gedung;

Hasilnya :

nama_gedungwaktu_mulaiwaktu_berakhirselisihGedung A2021-01-01 09:30:002022-01-20 10:25:001 mon 01:30:00Gedung B2022-01-20 11:00:002022-02-20 12:30:0006:05:00Gedung C2022-01-20 09:25:002022-01-20 15:30:001 year 19 days 00:55:00

Cara 3 : Menampilkan dalam Detik

Pada cara ini kita akan menampilkan selisihnya dalam satuan waktu detik

SELECT
    *, 
    EXTRACT(EPOCH FROM (waktu_berakhir-waktu_mulai)) AS selisih 
FROM gedung;

Hasilnya :

nama_gedungwaktu_mulaiwaktu_berakhirselisihGedung A2021-01-01 09:30:002022-01-20 10:25:002683800Gedung B2022-01-20 11:00:002022-02-20 12:30:0021900Gedung C2022-01-20 09:25:002022-01-20 15:30:0033180900

Oke sekian untuk postingan kali ini, semoga bermanfaat yaaa 🙂

Tipe data tanggal (DATE) merupakan salah satu tipe data yang cukup sulit digunakan. Selain memerlukan format tersendiri, hasil dari kolom dengan tipe data date juga ‘terbalik’, yakni dengan format tampilan YYYY-MM-DD.

Dalam tutorial belajar MySQL kali ini saya akan membahas beberapa fungsi MySQL yang bisa digunakan untuk mengambil dan menampilkan tipe data DATE.

img

Penjelasan cara penggunaan tipe data DATE MySQL telah dibahas pada: Tutorial MySQL Tipe Data Date (Tanggal).


Mempersiapkan Tabel belajar_date

Sebagai tabel sample, saya akan membuat tabel belajar_date. Tabel ini terdiri dari dua kolom bertipe DATE dan TIMESTAMP. Berikut query yang saya gunakan:

mysql> CREATE TABLE belajar_date (dt DATE,ts TIMESTAMP);
Query OK, 0 rows affected (0.08 sec)
 
mysql> INSERT INTO belajar_date VALUES ('2015-08-10','2015-08-10 08:30:15');
Query OK, 1 row affected (0.03 sec)
 
mysql> INSERT INTO belajar_date VALUES ('2016-08-17','2016-08-17 10:01:01');
Query OK, 1 row affected (0.04 sec)
 
mysql> INSERT INTO belajar_date VALUES ('2017-12-31','2017-12-31 23:59:59');
Query OK, 1 row affected (0.05 sec)
 
mysql> SELECT * FROM belajar_date;
+------------+---------------------+
| dt         | ts                  |
+------------+---------------------+
| 2015-08-10 | 2015-08-10 08:30:15 |
| 2016-08-17 | 2016-08-17 10:01:01 |
| 2017-12-31 | 2017-12-31 23:59:59 |
+------------+---------------------+
3 rows in set (0.00 sec)

Seperti yang terlihat, MySQL menyimpan kolom bertipe data DATE menggunakan format YYYY-MM-DD, dan untuk tipe data TIMESTAMP dengan format YYYY-MM-DD HH:MM:SS.


Fungsi MySQL untuk Mengambil Nilai Date

MySQL menyediakan beragam fungsi untuk mengambil sebagian data dari kolom bertipe DATE dan TIMESTAMP. Sebagai contoh, kita bisa menggunakan fungsi YEAR() untuk mengambil bagian tahun, seperti query berikut ini:

mysql> SELECT YEAR(dt) FROM belajar_date;
+----------+
| YEAR(dt) |
+----------+
|     2015 |
|     2016 |
|     2017 |
+----------+
3 rows in set (0.00 sec)

Pada query diatas, saya menampilkan hanya nilai tahun dari kolom dt. Bagaimana dengan nilai Bulan dan Tanggal? Berikut querynya:

mysql> SELECT MONTH(dt) FROM belajar_date;
+-----------+
| MONTH(dt) |
+-----------+
|         8 |
|         8 |
|        12 |
+-----------+
3 rows in set (0.00 sec)
 
mysql> SELECT DAY(dt) FROM belajar_date;
+---------+
| DAY(dt) |
+---------+
|      10 |
|      17 |
|      31 |
+---------+
3 rows in set (0.00 sec)

Selain fungsi YEAR(), MONTH() dan DAY() yang saya gunakan, tabel berikut merangkum beberapa fungsi lain yang bisa digunakan untuk tipe data DATE dan TIMESTAMP:

Nama FungsiHasilYEAR()Menampilkan nilai tahunMONTH()Menampilkan nilai bulan (1..12)MONTHNAME()Menampilkan nama bulan (January..December)DAYOFMONTH()Menampilkan nilai tanggal (1..31)DAYNAME()Menampilkan nama hari (Sunday..Saturday)DAYOFWEEK()Menampilkan nilai hari (angka 1..7)WEEKDAY()Menampilkan nilai hari (angka 0..6)DAYOFYEAR()Menampilkan urutan hari (1..366)HOUR()Menampilkan nilai jam (0..23)MINUTE()Menampilkan nilai menit (0..59)SECOND()Menampilkan nilai detik(0..59)

Dengan menggunakan fungsi-fungsi ini kita bisa mengambil nilai yang diinginkan dari kolom DATE dan TIMESTAMP:

mysql> SELECT HOUR(ts) FROM belajar_date;
+----------+
| HOUR(ts) |
+----------+
|        8 |
|       10 |
|       23 |
+----------+
3 rows in set (0.00 sec)
 
mysql> SELECT MINUTE(ts) FROM belajar_date;
+------------+
| MINUTE(ts) |
+------------+
|         30 |
|          1 |
|         59 |
+------------+
3 rows in set (0.00 sec)
 
mysql> SELECT SECOND(ts) FROM belajar_date;
+------------+
| SECOND(ts) |
+------------+
|         15 |
|          1 |
|         59 |
+------------+
3 rows in set (0.00 sec)
 
mysql> SELECT DAYOFYEAR(ts) FROM belajar_date;
+---------------+
| DAYOFYEAR(ts) |
+---------------+
|           222 |
|           230 |
|           365 |
+---------------+
3 rows in set (0.00 sec)
 
mysql> SELECT DAYNAME(ts) FROM belajar_date;
+-------------+
| DAYNAME(ts) |
+-------------+
| Monday      |
| Wednesday   |
| Sunday      |
+-------------+
3 rows in set (0.06 sec)
 
mysql> SELECT ts, DAYNAME(ts) FROM belajar_date;
+---------------------+-------------+
| ts                  | DAYNAME(ts) |
+---------------------+-------------+
| 2015-08-10 08:30:15 | Monday      |
| 2016-08-17 10:01:01 | Wednesday   |
| 2017-12-31 23:59:59 | Sunday      |
+---------------------+-------------+
3 rows in set (0.00 sec)

Fungsi CURDATE() dan NOW()

Masih berkaitan dengan tipe data date, MySQL menyediakan fungsi bawaan untuk menghasilkan nilai DATE dan TIMESTAMP sistem saat ini. Fungsi yang bisa digunakan adalah CURDATE() dan NOW().

Berikut contohnya:

mysql> INSERT INTO belajar_date VALUES (CURDATE(), NOW());
Query OK, 1 row affected (0.03 sec)
 
mysql> SELECT * FROM belajar_date;
+------------+---------------------+
| dt         | ts                  |
+------------+---------------------+
| 2015-08-10 | 2015-08-10 08:30:15 |
| 2016-08-17 | 2016-08-17 10:01:01 |
| 2017-12-31 | 2017-12-31 23:59:59 |
| 2015-08-04 | 2015-08-04 15:34:14 |
+------------+---------------------+
4 rows in set (0.00 sec)

Fungsi CURDATE() akan menghasilkan nilai DATE yang ada di server dengan format YYYY-MM-DD, sedangkan fungsi NOW() akan menghasilkan nilai TIMESTAMP dengan format YYYY-MM-DD HH:MM:SS. Dalam query diatas, saya menggunakan kedua fungsi ini untuk menginput data baru ke dalam tabel belajar_date.

Dapat anda lihat bahwa kode diatas dijalankan pada tanggal 4 Agustus 2015 pukul 15:34:14, sesuai dengan sistem komputer yang saya gunakan (baris terakhir pada tabel).


Fungsi-fungsi tanggal yang kita bahas kali ini cocok untuk menformat tampilan kolom dengan tipe data DATE dan TIMESTAMP di dalam MySQL. Untuk hasil yang lebih fleksibel, bisa menggunakan fungsi DATE_FORMAT() yang akan saya bahas pada tutorial terpisah.