Oracle SQL:返回输入分钟和最大日期字段的不同天数

发布于 2025-02-13 21:11:39 字数 418 浏览 0 评论 0原文

是以下正确的方法来获得日期范围(日期字段的最小和最大)的不同天数的正确方法,我打算从中创建一个SQL视图:

with range as (
  select min(date) start_date,
       max(date) end_date
  from table
)
  select start_date + level - 1 AS "DATE",
  extract(month from start_date + level - 1) AS "MONTH",
  extract(year from start_date + level - 1) AS "YEAR"
  from range
  connect by level <= (
     trunc(end_date) - trunc(start_date) + 1
  );

Is the following the correct way to get a distinct list of days for a date range (min and max of a date field) I intend to create a sql view out of this:

with range as (
  select min(date) start_date,
       max(date) end_date
  from table
)
  select start_date + level - 1 AS "DATE",
  extract(month from start_date + level - 1) AS "MONTH",
  extract(year from start_date + level - 1) AS "YEAR"
  from range
  connect by level <= (
     trunc(end_date) - trunc(start_date) + 1
  );

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

岁月蹉跎了容颜 2025-02-20 21:11:39

如果需要时,您真的需要创建一个日期表


ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-YYYY';


CREATE OR REPLACE TYPE nt_date IS TABLE OF DATE;
/

CREATE OR REPLACE FUNCTION generate_dates_pipelined(
  p_from IN DATE,
  p_to   IN DATE
)
  RETURN nt_date PIPELINED DETERMINISTIC
IS
  v_start DATE := TRUNC(LEAST(p_from, p_to));
  v_end   DATE := TRUNC(GREATEST(p_from, p_to));
BEGIN
  LOOP
    PIPE ROW (v_start);
    EXIT WHEN v_start >= v_end;
    v_start := v_start + INTERVAL '1'DAY;
  END LOOP;
  RETURN;
END generate_dates_pipelined;
/

SELECT
        c.COLUMN_VALUE 
  FROM   
TABLE(generate_dates_pipelined(DATE '2022-07-01',
DATE '2022-07-31')) c

Do you really need to create a DATE table when you can generate one on the fly if needed


ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-YYYY';


CREATE OR REPLACE TYPE nt_date IS TABLE OF DATE;
/

CREATE OR REPLACE FUNCTION generate_dates_pipelined(
  p_from IN DATE,
  p_to   IN DATE
)
  RETURN nt_date PIPELINED DETERMINISTIC
IS
  v_start DATE := TRUNC(LEAST(p_from, p_to));
  v_end   DATE := TRUNC(GREATEST(p_from, p_to));
BEGIN
  LOOP
    PIPE ROW (v_start);
    EXIT WHEN v_start >= v_end;
    v_start := v_start + INTERVAL '1'DAY;
  END LOOP;
  RETURN;
END generate_dates_pipelined;
/

SELECT
        c.COLUMN_VALUE 
  FROM   
TABLE(generate_dates_pipelined(DATE '2022-07-01',
DATE '2022-07-31')) c

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文