【问题标题】:How to use complex condition in insert into select query in oracle如何在oracle中插入选择查询中使用复杂条件
【发布时间】:2020-10-22 07:05:51
【问题描述】:

我想在 oracle 中使用 insert 将一些记录插入到 select 查询中。我的条件应该是当 SITA_HOSTS 表中的 CREATE_DATE 月份与 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约会

【问题讨论】:

标签: oracle plsql oracle-apex


【解决方案1】:

这是一种方法:

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

TRUNC(date, 'MM') 截断到当月第一天的午夜。

【讨论】:

    【解决方案2】:

    这实际上取决于 sita-hosts 表中 create_date 的内容/含义和数据类型。除此之外,要求也不清楚。插页是否还应涵盖几年前创建的主机或仅包括上个月创建的主机?

    针对上个月创建的主机的解决方案。尝试强制使用索引(如果有的话)。

    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 子句将排除本月初午夜的所有时间。

    【讨论】:

      【解决方案3】:

      非常感谢各位。我已经编写了这段代码,它工作正常:

      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')
          );
      

      【讨论】:

        猜你喜欢
        • 2018-02-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-03
        • 1970-01-01
        • 2013-03-17
        • 2014-10-21
        相关资源
        最近更新 更多