oracle function计算时间是否是工作日的8:30-17:30
时间: 2024-02-25 08:52:56 浏览: 154
以下是一个可以判断时间是否是工作日的 Oracle 函数,该函数会返回一个布尔值:
```
CREATE OR REPLACE FUNCTION is_workday_time (p_date IN DATE) RETURN BOOLEAN IS
v_day_of_week NUMBER;
BEGIN
v_day_of_week := TO_CHAR(p_date, 'D');
IF v_day_of_week IN (6, 7) THEN -- 6 = Saturday, 7 = Sunday
RETURN FALSE;
ELSIF TO_CHAR(p_date, 'HH24:MI') NOT BETWEEN '08:30' AND '17:30' THEN
RETURN FALSE;
ELSE
RETURN TRUE;
END IF;
END;
```
该函数接受一个日期类型的参数 `p_date`,并使用 `TO_CHAR` 函数将该日期转换为星期几的数字表示(1 表示星期日,2 表示星期一,以此类推)。如果日期是周六或周日,函数会返回 `FALSE`,表示该天不是工作日。如果日期是工作日但时间不在 8:30 到 17:30 之间,函数也会返回 `FALSE`。如果日期既是工作日又在规定的时间范围内,函数会返回 `TRUE`,表示该时间是工作时间。
相关问题
oracle function计算时间是否是工作日
可以使用以下代码实现Oracle Function计算一个日期是否是工作日:
```sql
CREATE OR REPLACE FUNCTION is_workday(dt DATE) RETURN NUMBER IS
day_of_week NUMBER;
BEGIN
day_of_week := TO_CHAR(dt, 'D');
IF day_of_week >= 2 AND day_of_week <= 6 THEN
RETURN 1; -- 1表示是工作日
ELSE
RETURN 0; -- 0表示不是工作日
END IF;
END;
```
该函数接受一个日期参数,并返回一个数字,1表示该日期是工作日,0表示该日期不是工作日。使用TO_CHAR函数获取日期的星期几,星期一到星期五为工作日。
如何从bdc_Xm表中计算并过滤出工作日的办理时长,排除中午11:30至14:30和下午17:30之后的时间段?这个时间段涵盖了中午休息和下班时间,同时也需要排除周末的数据。开始时间是cjsj,结束时间是bjsj,从oracle中执行没有dateadd函数
要在Oracle数据库中计算并过滤出工作日的工作时长,并排除中午11:30至14:30和下午17:30之后的时间段,以及周末的数据,可以按照以下步骤操作:
1. 首先,你需要创建一个公共函数来判断日期是否为工作日。这通常涉及查询系统表`DBTIMEZONE.HOLIDAY`获取法定假日信息,然后检查日期是否为周六或周日:
```sql
CREATE OR REPLACE FUNCTION is_workday(date_in DATE) RETURN BOOLEAN AS
holiday_flag NUMBER;
BEGIN
SELECT COUNT(*) INTO holiday_flag FROM DBTIMEZONE.HOLIDAY WHERE HOLIDAY_DATE = date_in;
IF holiday_flag > 0 THEN
RETURN FALSE;
ELSE
RETURN TRUNC(SYSDATE, 'DD') = TRUNC(date_in, 'DD'); -- 如果不是节假日,则返回当天是否是工作日(非周末)
END IF;
END;
```
2. 然后,在查询`bdc_Xm`表时,使用`CONNECT BY`和`LEAD()`分析窗口函数来找出连续的开始时间和结束时间,同时加入上述`is_workday`函数的判断:
```sql
SELECT a.cjsj,
b.bjsj - a.cjsj AS work_duration
FROM (
SELECT cjsj,
ROW_NUMBER() OVER (PARTITION BY id ORDER BY cjsj) AS rn,
LAG(bjsj, 1) OVER (PARTITION BY id ORDER BY cjsj) AS prev_bjsj
FROM bdc_Xm
WHERE is_workday(cjsj)
) a
LEFT JOIN bdc_Xm b ON a.id = b.id AND a.rn = b.rn + 1
WHERE b.cjsj IS NOT NULL AND a.prev_bjsj + INTERVAL '1' HOUR < b.cjsj
AND b.cjsj < a.cjsj + INTERVAL '16:00' HOUR MINUTE; -- 排除午餐和下班时间
```
此查询首先筛选出工作日的数据,然后只计算那些开始时间和结束时间之间不超过16:00的工作时长。
阅读全文