如何在 insert into select 查询中使用复杂条件

How to use complex condition in insert into select query in oracle

我想在 oracle 中使用 insert into select 查询插入一些记录。我的条件应该是当 CREATE_DATE in SITA_HOSTS table 的月份等于 sysdate - 1 的月份时。现在我的问题是我应该为 where 语句写什么? 这是我的代码:

DECLARE
    p_year VARCHAR2(50);
    n_year NUMBER;
    n_month NUMBER;
    j_year VARCHAR2(4);
    j_month VARCHAR2(4);
    c_month NUMBER;
BEGIN
    SELECT TO_CHAR(sysdate, 'YYYY-MM-DD','nls_calendar=persian') INTO p_year FROM dual; --Change sysdate to jalali date
    
    SELECT regexp_substr(p_year,'[^-]+', 1, 1) INTO j_year
    FROM dual; -- Get year of jalalian sysdate
    
    SELECT regexp_substr(p_year,'[^-]+', 1, 2) INTO j_month
    FROM dual;--Get month of jalalian sysdate
    
    n_year := TO_NUMBER(j_year);
    n_month := TO_NUMBER(j_month);
    
    insert into sita_orders(REL_MODULE,REL_ID,CREATE_DATE,AMOUNT,CUSTOMER_ID,PROJECT_ID,ORDER_STATUS,TITLE,YEAR)
    SELECT 1,ID,sysdate,78787878,CUSTOMER_ID,PROJECT_ID,0,HOSTING_TITLE,j_year
    FROM SITA_HOSTS
    WHERE ????;
END;

最后我应该说我的日期是 Jalali 日期

这是一种方法:

WHERE TRUNC(create_date,'MM') = ADD_MONTHS(TRUNC(SYSDATE,'MM'), -1)

TRUNC(date, 'MM') 截断到日期所在月份第一天的午夜。

这实际上取决于 content/meaning 和 create_date 在 sita-hosts table 中的数据类型。除此之外,要求也不清楚。插入内容是否也包括几年前创建的主机或仅包括上个月创建的主机。

上个月创建的主机的解决方案。如果有索引,则尝试强制使用索引。

select <your select list>
 from sita_hosts
where create_date between add_months(trunc(sysdate,'mm')-1) and trunc(sysdate,'mm')
  and create_date < trunc(sysdate,'mm') 

第二个 where 子句将排除本月初午夜的所有时间。

非常感谢大家。我写了这段代码,它运行良好:

insert into sita_orders(REL_MODULE,REL_ID,CREATE_DATE,AMOUNT,CUSTOMER_ID,PROJECT_ID,ORDER_STATUS,TITLE,YEAR)
  SELECT 1,ID,sysdate,100000,CUSTOMER_ID,PROJECT_ID,0,HOSTING_TITLE,TO_CHAR(sysdate, 'YYYY','nls_calendar=persian')
    FROM SITA_HOSTS
  WHERE
    to_number(TO_CHAR(CREATE_DATE, 'MM','nls_calendar=persian')) <= to_number(TO_CHAR(sysdate, 'MM','nls_calendar=persian') - 1)
    and ID not in (
        select REL_ID from sita_orders where REL_MODULE=1 and YEAR=TO_CHAR(sysdate, 'YYYY','nls_calendar=persian')
    );