计算两个日期之间的工作时间

本文介绍了一个SQL脚本,用于创建工作时间表并定义一个函数来计算任意两个日期间的工作时间。该脚本首先检查是否存在名为'tb_worktime'的表,并在存在的情况下删除它。然后创建一个新的'tb_worktime'表,包含工作开始时间、结束时间和工作时长等字段。此外,还定义了一个名为'f_WorkTime'的函数,该函数接受开始和结束日期作为参数,并返回这两个日期之间的总工作时间。

if exists (select * from dbo.sysobjects where id = object_id(N'[tb_worktime]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [tb_worktime]
GO

--定义工作时间表
CREATE TABLE tb_worktime(
    ID       int identity(1,1) PRIMARY KEY,            --序号
    time_start smalldatetime,                            --工作的开始时间
    time_end  smalldatetime,                           --工作的结束时间
    worktime  AS DATEDIFF(Minute,time_start,time_end)  --工作时数(分钟)
)
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_WorkTime]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[f_WorkTime]
GO

--计算两个日期之间的工作时间
CREATE FUNCTION f_WorkTime(
@date_begin datetime,  --计算的开始时间
@date_end datetime     --计算的结束时间
)RETURNS int
AS
BEGIN
    DECLARE @worktime int
    IF DATEDIFF(Day,@date_begin,@date_end)=0
        SELECT @worktime=SUM(DATEDIFF(Minute,
            CASE WHEN CONVERT(VARCHAR,@date_begin,108)>time_start
                THEN CONVERT(VARCHAR,@date_begin,108)
                ELSE time_start END,
            CASE WHEN CONVERT(VARCHAR,@date_end,108)<time_end
                THEN CONVERT(VARCHAR,@date_end,108)
                ELSE time_end END))
        FROM tb_worktime
        WHERE time_end>CONVERT(VARCHAR,@date_begin,108)
            AND time_start<CONVERT(VARCHAR,@date_end,108)
    ELSE
        SET @worktime
            =(SELECT SUM(CASE
                    WHEN CONVERT(VARCHAR,@date_begin,108)>time_start
                    THEN DATEDIFF(Minute,CONVERT(VARCHAR,@date_begin,108),time_end)
                    ELSE worktime END)
                FROM tb_worktime
                WHERE time_end>CONVERT(VARCHAR,@date_begin,108))
            +(SELECT SUM(CASE
                    WHEN CONVERT(VARCHAR,@date_end,108)<time_end
                    THEN DATEDIFF(Minute,time_start,CONVERT(VARCHAR,@date_end,108))
                    ELSE worktime END)
                FROM tb_worktime
                WHERE time_start<CONVERT(VARCHAR,@date_end,108))
            +CASE
                WHEN DATEDIFF(Day,@date_begin,@date_end)>1
                THEN (DATEDIFF(Day,@date_begin,@date_end)-1)
                    *(SELECT SUM(worktime) FROM tb_worktime)
                ELSE 0 END
    RETURN(@worktime)
END

### Oracle 中计算两个日期之间工作日方法 在 Oracle 数据库中,为了精确地计算两个日期之间的有效工作日,通常会借助预先定义好的节假日表来辅助判断哪些日子是非工作日。具体实现上可以采用存储过程或自定义函数的形式完成这一逻辑处理。 对于给定的情况描述,在用户的环境中已经存在一张包含了全年每日信息的表格,其中通过特定标志位区分工作日与非工作日(例如:`1` 表示工作日;`2` 或其他值表示非工作日),这大大简化了后续操作流程的设计[^1]。 下面展示了一个基于上述条件构建的功能性 SQL 函数 `SUMDAY` 的例子: ```sql CREATE OR REPLACE FUNCTION SUMDAY( fodate IN DATE ) RETURN INT IS V_COUNT INT; BEGIN SELECT CASE WHEN COUNT(d.fdate) > 10 THEN 1 ELSE 0 END INTO V_COUNT FROM t_weekday d WHERE d.fflag = '1' -- 标记为工作日 AND d.fdate > TO_CHAR(fodate, 'YYYY-MM-DD') AND d.fdate <= TO_CHAR(SYSDATE, 'YYYY-MM-DD'); RETURN V_COUNT; END; / ``` 此段代码实现了如下功能: - 输入参数是一个起始日期 (`fodate`); - 查询位于该输入日期之后直至当前系统时间范围内被标记为工作日(`fflag='1'`)的具体记录数量; - 如果这段时间内存在的工作日数目超过十个,则返回数值 `1` ,反之则给出 `0` 。这种设计主要用于满足某些特殊业务场景下的需求判定[^2]。 然而值得注意的是,如果目的是单纯获取任意两指定日期间的实际工作日总数而非仅限于是否超出某个阈值的话,那么应当调整查询语句中的聚合方式以及输出结果形式以适应新的目标要求。比如修改后的版本可能更接近以下样式: ```sql CREATE OR REPLACE FUNCTION WORKDAYS_BETWEEN_DATES( start_date IN DATE, end_date IN DATE ) RETURN NUMBER AS work_days_count NUMBER := 0; BEGIN FOR rec IN (SELECT fdate FROM t_weekday WHERE fflag = '1' AND fdate BETWEEN start_date AND end_date) LOOP work_days_count := work_days_count + 1; END LOOP; RETURN work_days_count; END; / ``` 这段改进版脚本能够接收一对具体的开始和结束日期作为输入,并遍历介于此二者之间的所有符合条件的日程条目,累加得到最终的结果——即两者间确切的工作日总量[^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值