sql server,一个表里存着休假日历,有开始时间,结束时间,现在有一张工单,知道开工时间,和生产耗时,如何计算工单结束时间?

sql server,一个表里存着休假日历,有开始时间,结束时间,现在有一张工单,知道开工时间,和生产耗时,如何计算工单结束时间?

实质在计算每两个休假之间的有效工作时间,直接能满足工单的耗时。

建表语句

CREATE TABLE [dbo].[工厂日历](
	[ID] [int] IDENTITY(1,1) NOT NULL,
	[开始时间] [datetime] NULL,
	[结束时间] [datetime] NULL,
 CONSTRAINT [PK_日历_ID] PRIMARY KEY CLUSTERED 
(
	[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

函数

ALTER FUNCTION [dbo].[CalculateWorkOrderEndTime]  
(  
    @WorkOrderStartTime DATETIME,  
    @ProductionDurationSeconds INT  
)  
RETURNS DATETIME  
AS  
BEGIN  
    DECLARE @WorkOrderEndTime DATETIME;  
    DECLARE @CurrentTime DATETIME = @WorkOrderStartTime;  
    DECLARE @ElapsedTime INT = 0;  
  
    -- 循环直到生产耗时用完  
    WHILE @ElapsedTime < @ProductionDurationSeconds  
    BEGIN  
        -- 检查当前时间是否在休假期间  
        IF EXISTS (  
            SELECT 1  
            FROM [dbo].[工厂日历]  
            WHERE @CurrentTime >= [开始时间] AND @CurrentTime < [结束时间]  
        )  
        BEGIN  
            -- 如果在休假期间,跳到休假结束时间  
            SELECT TOP 1 @CurrentTime = [结束时间]  
            FROM [dbo].[工厂日历]  
            WHERE @CurrentTime >= [开始时间] AND @CurrentTime < [结束时间]  
            ORDER BY [结束时间] ASC;  
              
            -- 为了避免边界问题,将当前时间设置为休假结束后的第一秒  
            SET @CurrentTime = DATEADD(SECOND, 1, @CurrentTime);  
        END  
        ELSE  
        BEGIN  
            -- 如果不在休假期间,则消耗生产时间  
            SET @ElapsedTime = @ElapsedTime + DATEDIFF(SECOND, @CurrentTime, DATEADD(SECOND, 1, @CurrentTime));  
            SET @CurrentTime = DATEADD(SECOND, 1, @CurrentTime);  
        END  
    END  
  
    -- 设置工单结束时间为当前时间(已经考虑完所有休假和生产耗时)  
    SET @WorkOrderEndTime = @CurrentTime;  
  
    RETURN @WorkOrderEndTime;  
END

测试
在这里插入图片描述

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值