0
0
0
share
#database#database#Microsoft#Microsoft
0 Komentar
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.
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.
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.
Tampaknya DATEDIFF dengan opsi YEAR
hanya melihat tahunnya saja. Dan bila dipakai MONTH
atau DAY
juga tidak sesuai.
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.
Dari resultset yang ada, kita dapat melihat tanggal-per-tahun yang dibuat berdasarkan tahun dari tanggal cache.
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.
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.
Sayangnya hasil dari fungsi ini juga tidak sesuai yang kita perlukan, bahkan berbeda juga bila dibandingkan dengan DATEDIFF.
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.
Hasilnya pun seperti yang kita perlukan.
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.
Resultset yang didapat sudah seperti yang di-inginkan.
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.
0
0
0
share