作者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)
1F:推 MOONRAKER:赞 12/18 09:58
2F:推 JYHuang:JYHuang与MOONRAKER都说这个赞 12/18 22:42
3F:推 JYHuang:ㄟ....这个算法有误喔.... 12/20 17:10