Friday 30 November 2012

Fungsi Datediff untuk mendapatkan selisih waktu

 

Gunakan Fungsi

DATEDIFF ( datepart , startdate , enddate

untuk menghitung seilish waktu

Datepart Abbreviations
Year yy, yyyy
quarter qq, q
Month mm, m
dayofyear dy, y
Day dd, d
Week wk, ww
Hour hh
minute mi, n
second ss, s
millisecond ms


Select datediff(d,'6/25/2012','12/31/2012')

result   :   189


Select datediff(m,'6/25/2012','12/31/2012')

result   :   6


Select datediff(yy,'6/25/2012','12/31/2012')

result   :   0





Contoh penggunaan datediff yang cukup rumit


Menentukan berapa bulan karyawan bekerja di tahun 2012 ini hingga 1 Oktober 2012 berdasarkan tanggal masuknya.

NIK  Nama Tanggal_Masuk
=== ======== ====================
A001 Andrianto 21 April 2010
A002 Aswin 15 Oktober 2010
A003 Anwar 12 Februari 2011
A004 Arfan 05 Maret 2012
A005 Bobon 23 Mei 2012

Jika kita langsung menggunakan rumus datediff(m, tanggal_masuk,'10/1/2012') hasilnya akan salah, karena kita hanya menghitung di tahun 2012 saja.

dengan sedikit penambahan fungsi case dan mod (%) maka berikut hasilnya:

Select nik, nama, tanggal_masuk, datediff(M,Case when tanggal_masuk<'1/1/2012' then '1/1/2012' else tanggal_masuk end,'10/1/2012') % 12 as jumlah_bulan_kerja_2012
from mstkaryawan 


NIK  Nama Tanggal_Masuk Jumlah_bulan_kerja_2012
=== ======== ===========  ==========================
A001 Andrianto 21 April 2010 9
A002 Aswin 15 Oktober 2010 9
A003 Anwar 12 Februari 2011 9
A004 Arfan 05 Maret 2012 6
A005 Bobon 23 Mei 2012 4



Penjelasan :

datediff(M,Case when tanggal_masuk<'1/1/2012' then '1/1/2012' else tanggal_masuk end,'10/1/2012')

Datediff('M',...,...)  digunakan untuk selisih bulan antara tanggal masuk dengan tanggal 1 Oktober 2012.
Case digunakan jika tanggal masuk karyawan < '1/1/2012' maka dianggap masa kerja karyawan tahun 2012 dimulai dari bulan Januari 
Contoh :

A001 Andrianto 21 April 2010 (menjadi 1/1/2012')     9 (dari Januari 2012 s/d 1 Oktober 2012)
A002 Aswin 15 Oktober 2010  (menjadi 1/1/2012')   9 (dari Januari 2012 s/d 1 Oktober 2012)
A003 Anwar 12 Februari 2011  (menjadi 1/1/2012')   (dari Januari 2012 s/d 1 Oktober 2012)

Jika tanggal masuk kerja lebih dari (>) 1/1/2012 maka langsung dihitung dari tanggal masuk kerja .

A004 Arfan 05 Maret 2012 (dari Maret 2012 s/d 1 Oktober 2012)
A005 Bobon 23 Mei 2012 (dari Mei 2012 s/d 1 Oktober 2012)


Sedangkan untuk fungsi MOD itu sendiri menggunakan tanda   %
datediff(M,Case when tanggal_masuk<'1/1/2012' then '1/1/2012' else tanggal_masuk end,'10/1/2012') % 12 as jumlah_bulan_kerja_2012

...  % 12 maka akan mengambil sisa pembagian bulan dari tanggal masuk dibagi 12.

4 comments:
Write comments
  1. sorry gan.. ane coba koq error ya...
    Incorrect parameter count in the call to native function 'datediff'
    muncul ntu pesan gan..

    ReplyDelete
  2. maaf mas doni pake sql server kan bukan mysql? syntax sql ini saya jalankan di sql server..coba kirim syntaknya..saya mau bantu

    ReplyDelete
  3. ngga berhasil untuk datepartnya padahal saya isi

    ReplyDelete