在某个时间段查找某连续出现问题

语法

ROW_NUMBER() OVER(PARTITION BY 列名1 ORDER BY 列名2)

  • ROW_NUMBER()是一个SQL server函数,它为结果集的分区中的每一行分配一个连续的整数。 行号以每个分区中第一行的行号开头。
  • PARTITION BY子句将结果集划分为分区。 ROW_NUMBER()函数分别应用于每个分区,并重新初始化每个分区的行号。PARTITION BY子句是可选的。如果未指定,ROW_NUMBER()函数会将整个结果集视为单个分区。
  • ORDER BY子句定义结果集的每个分区中的行的逻辑顺序。 ORDER BY子句是必需的,因为ROW_NUMBER()函数对顺序敏感。
-- =============================================    
-- Author:  temp    
-- Create date: 2019-07-25    
-- Description: 查当前员工当月连续请假超过5天的    
-- =============================================    
ALTER    FUNCTION [dbo].[fn_ContinuationLeave]
    (
      @employeeCode VARCHAR(20) ,
      @yearMonth VARCHAR(7)
    )
RETURNS INT
AS
    BEGIN    
     
        DECLARE @whether INT = 0;    
            
        DECLARE @startDate DATE ,
            @endDate DATE;    
        SET @startDate = @yearMonth + '-01';    
            
        SET @endDate = CONVERT(VARCHAR(10), DATEADD(DAY, -1,
                                                    DATEADD(MONTH, 1,
                                                            @startDate)), 120);    
        SELECT  @whether = COUNT(1)
        FROM    ( SELECT    a1.EmployeeCode ,
                            MIN(ClassDate) startDate ,
                            MAX(ClassDate) endDate ,
                            COUNT(*) counts
                  FROM      ( SELECT    * ,
                                        ClassDate
                                        - ROW_NUMBER() OVER ( PARTITION BY EmployeeCode ORDER BY ClassDate ) re
                              FROM      vwgCheckWorkQuery
                              WHERE     SumLN = 1
                                        AND SumLT >= 8
                            ) a1
                  WHERE     a1.ClassDate BETWEEN @startDate AND @endDate
                            AND a1.EmployeeCode = @employeeCode
                  GROUP BY  a1.EmployeeCode ,
                            re
                  HAVING    COUNT(1) >= 6 --将数据分组的对比后再分组,因为相差的间隔是一样,再根据差值一样就说明是无间隔连续的天数
                ) a;    
                   
        RETURN @whether;      
    END;  

转载于:https://www.cnblogs.com/youMo/p/11271923.html

好的,根据您的问题描述,可以采用以下的Java代码实现: ```java import java.time.LocalTime; import java.util.ArrayList; import java.util.List; public class DeviceSchedule { // 设备的日常工作时间段列表 private List<TimeRange> workTimeRanges; public DeviceSchedule(String workTimeRangeStr) { this.workTimeRanges = parseTimeRanges(workTimeRangeStr); } // 解析时间段字符串,返回时间段列表 private List<TimeRange> parseTimeRanges(String timeRangesStr) { List<TimeRange> timeRanges = new ArrayList<>(); String[] timeRangeStrs = timeRangesStr.split(";"); for (String timeRangeStr : timeRangeStrs) { String[] startEndTimes = timeRangeStr.split("-"); LocalTime startTime = LocalTime.parse(startEndTimes[0]); LocalTime endTime = LocalTime.parse(startEndTimes[1]); timeRanges.add(new TimeRange(startTime, endTime)); } return timeRanges; } // 判断设备在某天的空闲时间段中是否有满足工序时间的连续工作时间段 public boolean hasFreeTime(LocalTime startFreeTime, LocalTime endFreeTime, int workMinutes) { // 找出设备在空闲时间段内的可用时间段列表 List<TimeRange> availableTimeRanges = new ArrayList<>(); for (TimeRange workTimeRange : workTimeRanges) { TimeRange availableTimeRange = workTimeRange.intersect(new TimeRange(startFreeTime, endFreeTime)); if (availableTimeRange != null) { availableTimeRanges.add(availableTimeRange); } } // 遍历可用时间段列表,查找满足工序时间的连续工作时间段 for (TimeRange availableTimeRange : availableTimeRanges) { LocalTime startTime = availableTimeRange.getStartTime(); LocalTime endTime = startTime.plusMinutes(workMinutes); if (endTime.isBefore(availableTimeRange.getEndTime())) { // 找到了满足条件的连续工作时间段 return true; } } // 没有找到满足条件的连续工作时间段 return false; } // 时间段类 private static class TimeRange { private LocalTime startTime; private LocalTime endTime; public TimeRange(LocalTime startTime, LocalTime endTime) { this.startTime = startTime; this.endTime = endTime; } public LocalTime getStartTime() { return startTime; } public LocalTime getEndTime() { return endTime; } // 计算两个时间段的交集 public TimeRange intersect(TimeRange other) { LocalTime newStartTime = this.startTime.isBefore(other.endTime) ? other.endTime : this.startTime; LocalTime newEndTime = this.endTime.isAfter(other.startTime) ? other.startTime : this.endTime; if (newStartTime.isBefore(newEndTime)) { return new TimeRange(newStartTime, newEndTime); } else { return null; } } } } ``` 以上的代码中,`DeviceSchedule` 类表示某个设备的日程安排,它包含了这个设备的日常工作时间段列表,在构造函数中从字符串中解析出来;`hasFreeTime` 方法用于判断设备在某天的空闲时间段中是否有满足工序时间的连续工作时间段,它首先找出设备在空闲时间段内的可用时间段列表,然后遍历可用时间段列表,查找满足工序时间的连续工作时间段。 注意,以上代码中的时间段类 `TimeRange` 实现了计算两个时间段的交集的方法,这个方法在判断设备在空闲时间段内的可用时间段列表时用到了。 您可以按照以下的方式使用 `DeviceSchedule` 类: ```java public static void main(String[] args) { // 创建一个设备的日程安排对象 DeviceSchedule deviceSchedule = new DeviceSchedule("08:00-12:00;13:00-17:00"); // 判断设备在某天的空闲时间段中是否有满足工序时间的连续工作时间段 LocalTime startFreeTime = LocalTime.parse("08:00"); LocalTime endFreeTime = LocalTime.parse("08:30"); int workMinutes = 15; boolean hasFreeTime = deviceSchedule.hasFreeTime(startFreeTime, endFreeTime, workMinutes); System.out.println(hasFreeTime); // 输出 true } ``` 以上代码中,首先创建了一个设备的日程安排对象 `deviceSchedule`,它的日常工作时间段为 08:00-12:00 和 13:00-17:00。然后调用 `hasFreeTime` 方法,传入设备在某天的空闲时间段起始时间和结束时间以及工序需要的工作时间,判断设备在这个空闲时间段内是否有满足工序时间的连续工作时间段,并将结果输出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值