作者evernever (NeverEver)
看板PHP
標題Re: [請益] 計算扣掉六日的日期區間
時間Fri Dec 17 19:38:09 2010
小弟建議從 SQL 下手, Database 撈出來再用 PHP 過濾, 感覺不會比較快
寫個 function 計算工作日如下:
=====================
DELIMITER $$
CREATE FUNCTION business_day(from_date DATE, to_date DATE)
RETURNS INT
BEGIN
DECLARE days, offset_days int;
SET offset_days =
CASE WHEN WEEKDAY(from_date) > 4
THEN 6 - WEEKDAY(from_date) ELSE 0 END +
CASE WHEN WEEKDAY(to_date) > 4
THEN WEEKDAY(to_date) - 4 ELSE 0 END;
SET days = DATEDIFF(to_date, from_date);
RETURN days DIV 7 * 5 + days % 7 - offset_days;
END $$
=====================
# 選出所有工作天 > 3
SELECT *
FROM `table`
WHERE business_day(from_date, to_date) > 3
希望對您有所幫助
※ 引述《JYHuang (夏天到了,冷不起來了說)》之銘言:
: ※ 引述《roga (任性)》之銘言:
: : 因為耗時間才要交給機器做,
: : 不過好的作法可以讓機器少耗一些時間就是了...
: : 看你的資料的複雜度吧,
: : 1. 只有日期,而且連續,那每七天扣掉兩天就是你的答案。
: 是連續的
: 要從撈出來的資料比對欄位B的日期
: 是否在欄位A日期+n天的區間內(排除六日)
: 一開始打算直接在SQL Server做判斷的..
: 不過這樣SQL會落落長的落落長,而且加重SQL Server的Loading
: 接著打算想試試能不能用數學式來推(用+-%..之類的)
: 推不出來最後目前換成用data函數
: 1.先比對是否為同一週 (直接B-A)
: 2.計算日期A距週六幾天
: 3.計算日期B距週日幾天
: 再做(相隔週數-1)*5 + (週六-A天數) + B距週日天數
: : 至於效能方面不用太擔心,這種計算不會很花時間
: : 以我的筆電,比對 10,000 次花 0.3 秒而已。
: 如果是數百筆,然後每一筆都逐日筆對的話
: 時間好像就不小了..
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 115.64.54.125
※ 編輯: evernever 來自: 115.64.54.125 (12/18 06:19)
推 MOONRAKER:贊 12/18 09:58
推 JYHuang:JYHuang與MOONRAKER都說這個贊 12/18 22:42
推 JYHuang:ㄟ....這個算法有誤喔.... 12/20 17:10