暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 计算日期之间的特定日期功能

askTom 2018-06-13
327

问题描述

你好,

我有一个基本函数,计算两个日期之间的星期一数:

create or replace FUNCTION COUNT_MONDAYS(p_startdate DATE, p_enddate DATE) RETURN NUMBER
AS
   v_NUMBEROFDAYS NUMBER;
BEGIN
  SELECT COUNT(1) INTO v_NUMBEROFDAYS
  FROM dual
  WHERE TO_CHAR(p_startdate+LEVEL-1, 'D', 'nls_date_language=ENGLISH') IN ('2')
  CONNECT BY TRUNC(p_startdate)+LEVEL-1 <= TRUNC(p_enddate);

  RETURN v_NUMBEROFDAYS;
END;​
复制


我想做的是添加一个 'if then',根据提供的日期给我天数。例如,我有一个时间表表。时间表可以是周一至周五,有些可以是几天。我希望能够根据时间表计算出个人天数。

我已经尝试过了,但是当我在SQL workshop中运行它时,该语句挂起。你能给出任何建议吗?

create or replace FUNCTION FN_COUNT_DAYS(p_Day VARCHAR2, p_startdate DATE, p_enddate DATE) RETURN NUMBER
AS
   v_NUMBEROFDAYS NUMBER;

BEGIN
IF p_DAY = 'Monday' then
  SELECT COUNT(1) INTO v_NUMBEROFDAYS
  FROM tran_schedule
  WHERE TO_CHAR(p_startdate+LEVEL-1, 'D', 'nls_date_language=ENGLISH') IN ('2')
  CONNECT BY TRUNC(p_startdate)+LEVEL-1 <= TRUNC(p_enddate);
RETURN v_NUMBEROFDAYS;

 ELSE

IF p_DAY = 'Tuesday' then
  SELECT COUNT(1) INTO v_NUMBEROFDAYS
  FROM tran_schedule
  WHERE TO_CHAR(p_startdate+LEVEL-1, 'D', 'nls_date_language=ENGLISH') IN ('3')
  CONNECT BY TRUNC(p_startdate)+LEVEL-1 <= TRUNC(p_enddate);
RETURN v_NUMBEROFDAYS;

ELSE

IF p_DAY = 'Wednesday' then
  SELECT COUNT(1) INTO v_NUMBEROFDAYS
  FROM tran_schedule
  WHERE TO_CHAR(p_startdate+LEVEL-1, 'D', 'nls_date_language=ENGLISH') IN ('4')
  CONNECT BY TRUNC(p_startdate)+LEVEL-1 <= TRUNC(p_enddate);
RETURN v_NUMBEROFDAYS;

END IF;
END IF;
END IF;
END;

schedule table:
create table Schedule
(schedule_id number(38,0)constraint schedule_schedule_id_PK primary key,
run_id number(38,0) not null,
constraint schedule_run_id_fk foreign key (run_id) references run(run_id),
day varchar2(10)not null,
arrival_time char(5)not null,
dropoff_loc varchar2(100)not null,
collection_time char(5)not null,
pickup_loc varchar2(100)not null);
复制


谢谢

专家解答

当您有单行要使用时,“connect by” 方法将起作用。这就是为什么你的工作示例有一个select-从-dual。然后,我们将合成此单行中的行。

因此,当您用 “tran_schedule” 替换它时,您需要首先从该表中提取一行。

我不完全确定tran_schedule的内容在这里,以及它适合你的要求是什么-我正在做一个 * 猜测 *,对于给定的时间表,你想找到 “天”,并使用它传递的开始/结束。

所以你会有这样的东西:

 SELECT COUNT(1) INTO v_NUMBEROFDAYS
  FROM ( select day from tran_schedule where run_id = p_run_id ) x
  WHERE TO_CHAR(p_startdate+LEVEL-1, 'DAY', 'nls_date_language=ENGLISH') = x.day
  CONNECT BY TRUNC(p_startdate)+LEVEL-1 <= TRUNC(p_enddate);
复制


「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论