Mendapatkan Jumlah Selisih Tahun dari Dua Tanggal pada SQL

Soeleman 25 April 2017

Mendapatkan Jumlah Selisih Tahun dari Dua Tanggal pada SQL

Fungsi bawaan database dibuat untuk memenuhi kebutuhan pengunanya. Ia dibuat sedemikian rupa seperti yang dipikirkan oleh pembuatnya. Kadang sesuai dengan yang kita inginkan, tapi tentu tidak dapat memuaskan semua skenario yang ada. Seperti ingin mendapatkan berapa tahun dari sebuah bentangan tanggal. Jika melihat apa yang bisa dilakukan oleh fungsi bawaan berbeda dengan yang kita inginkan tentu kita perlu melakukan sesuatu untuk itu.

Table

Sekarang kita siapkan table pendukung untuk tulisan ini.

Table EmpHistory

Dalam Table EmpHistory berisi sejarah dari tanggal cache beserta tanggal bergabungnya seorang pekerja. Disini tidak ditampilkan semua column-nya. Bagi pembaca yang penting adalah kedua column tersebut.

alt text

Target Resultset

Kebutuhan query ini sederhana saja. Yang diperlukan adalah menghitung berapa tahun sudah pekerja ini bekerja dengan melihat kapan cache-nya dibuat. Dan bagi pengguna, logikanya satu tahun itu sama persis dengan tanggal. Contohnya tanggal masuk 2015.03.02, maka ia akan satu tahun kalau sama atau lebih bila 2016.03.02 . Bagi user ini masuk akal, tapi tidak dengan fungsi bawaan.

alt text

T-SQL

Untuk mendapatkan berapa tahun dari sebuah bentangan tanggal kita bisa menggunakan DATEDIFF. Sayangnya fungsi ini tidak memiliki opsi tambahan untuk merubah bagaimana fungsi ini bekerja.

T-SQL DATEDIFF

Sebagaimana yang disebutkan diatas. Kita akan lihat hasil yang dihasilkan oleh DATEDIFF sesuai target resultset.

alt text

Tampaknya DATEDIFF dengan opsi YEAR hanya melihat tahunnya saja. Dan bila dipakai MONTH atau DAY juga tidak sesuai.

alt text

T-SQL Date

Sebagian dari solusinya adalah kita perlu membuat tanggal-per-tahun yang dibandingkan dengan tanggal cache. Ada beberapa cara, disini kita hanya tampilkan dengan DATEADD dan DATETIMEFROMPARTS. DATETIMEFROMPARTS ini hanya untuk SQL Server 2012.

alt text

Dari resultset yang ada, kita dapat melihat tanggal-per-tahun yang dibuat berdasarkan tahun dari tanggal cache.

alt text

T-SQL Solusi

Karena kita punya tanggal-per-tahun maka kita bisa membandingkan kembali dengan tanggal cache. Ini dilakukan untuk menjawab satu tahun berdasarkan tanggal gabung. Ada satu lagi yang kita perlu tangani. Yaitu apabila ada tanggal cache dibawah tanggal-per-tahun tapi masih dalam bulan yang sama, maka kita perlu mengeser bulannya. Dengan begitu DATEDIFF dengan YEAR akan menghasilkan perhitungan yang kita perlukan.

Tentu ini hanya contoh persyaratan yang sederhana. Apabila ada kebutuhan lainnya cukup memodifikasi saja.

alt text

MySQL

Sekarang kita akan coba lihat apabila cara ini bisa dilakukan pada database MySQL.

MySQL TIMESTAMPDIFF

MySQL tidak memiliki fungsi DATEDIFF, tapi ia memiliki fungsi yang mirip. Fungsi tersebut adalah TIMESTAMPDIFF.

alt text

Sayangnya hasil dari fungsi ini juga tidak sesuai yang kita perlukan, bahkan berbeda juga bila dibandingkan dengan DATEDIFF.

alt text

MySQL Date

Karena solusi kita memerlukan kita membuat tanggal-per-tahun. Kita bisa menggunakan kombinasi DATE_ADD dan MAKEDATE serta bisa juga dipakai fungsi STR_TO_DATE.

alt text

Hasilnya pun seperti yang kita perlukan.

alt text

MySQL Solusi

Cara penyelesaiannya juga sama. Yang berbeda adalah penggunaan fungsi yang berbeda. Seperti DATE_SUB, DATE_ADD, TIMESTAMPDIFF dan MAKEDATE. Dan kita juga perlu menyesuaikan ketika menggunakan TIMESTAMPDIFF, seperti yang terlihat pada SQL dibawah.

alt text

Resultset yang didapat sudah seperti yang di-inginkan.

alt text

Penutup

Ketika fungsi bawaan dari database tidak bekerja seperti yang kita butuh. Kita perlu bekerja disekitar itu agar tujuan kita tercapai. Salah satu caranya dengan memberikan data yang tepat ke fungsi tersebut.

Referensi

Perhatian! Code yang ditampilkan dalam tulisan ini merupakan ilustrasi dari yang ingin dipaparkan dan bukan production ready code. Sudah banyak kejadian karena asal meng-copy-and-paste tanpa mengerti code yang diambil itu ke dalam production. Selain itu perlu ada tambahan code dan test sebelum siap untuk digunakan secara utuh.