Ungkapan ini -
5 * (DATEDIFF(@E, @S) DIV 7) + MID('0123444401233334012222340111123400012345001234550', 7 * WEEKDAY(@S) + WEEKDAY(@E) + 1, 1)
menghitung jumlah hari kerja antara tanggal mulai @S dan tanggal akhir @E.
Asumsikan tanggal akhir (@E) tidak sebelum tanggal mulai (@S).Kompatibel dengan DATEDIFF karena tanggal mulai dan tanggal akhir yang sama memberikan nol hari kerja.Mengabaikan hari libur.
String angka dibangun sebagai berikut. Buat tabel hari mulai dan hari akhir, baris harus dimulai dengan senin (HARI WEEK0) dan kolom harus dimulai dengan hari Senin juga. Isi diagonal dari kiri atas ke kanan bawah dengan semua 0 (yaitu ada 0 hari kerja antara Senin dan Senin, Selasa dan Selasa, dll.). Untuk setiap hari dimulai dari diagonal (harus selalu 0) dan isi kolom hingga benar, satu hari pada suatu waktu. Jika Anda mendarat di kolom hari akhir pekan (non hari kerja), jumlah hari kerja tidak berubah, itu dibawa dari kiri. Jika tidak, jumlah hari kerja bertambah satu. Ketika Anda mencapai akhir baris, ulangi kembali ke awal baris yang sama dan lanjutkan hingga Anda mencapai diagonal lagi. Kemudian lanjutkan ke baris berikutnya.
Misalnya. Dengan asumsi hari Sabtu dan Minggu bukan hari kerja -
| M T W T F S S
-|--------------
M| 0 1 2 3 4 4 4
T| 4 0 1 2 3 3 3
W| 3 4 0 1 2 2 2
T| 2 3 4 0 1 1 1
F| 1 2 3 4 0 0 0
S| 1 2 3 4 5 0 0
S| 1 2 3 4 5 5 0
Kemudian gabungkan 49 nilai dalam tabel ke dalam string.
Beri tahu saya jika Anda menemukan bug.
-Tabel yang disempurnakan:
| M T W T F S S
-|--------------
M| 0 1 2 3 4 4 4
T| 4 0 1 2 3 3 3
W| 3 4 0 1 2 2 2
T| 2 3 4 0 1 1 1
F| 1 2 3 4 0 0 0
S| 0 1 2 3 4 0 0
S| 0 1 2 3 4 4 0
string yang ditingkatkan:'012344440123333401222340111123400001234000123440'
ekspresi yang ditingkatkan:
5 * (DATEDIFF(@E, @S) DIV 7) + MID('0123444401233334012222340111123400001234000123440', 7 * WEEKDAY(@S) + WEEKDAY(@E) + 1, 1)