繁体   English   中英

Oracle SQL 将 sql 值设置为变量

[英]Oracle SQL set sql values to variable

我正在尝试比较同一张表之间的日期。 我想将每个值存储到一个变量中并比较两个日期之间是否有一个月的差异。

这是我的表结构:

表名:系统参数
SEQNO - INT 主键
系统日期 - 日期

这是我想要实现的目标:

var startdate = "SELECT SYSTEMDATE FROM SYSTEMPARAM WHERE SEQNO = '1'";
var enddate = "SELECT SYSTEMDATE FROM SYSTEMPARAM WHERE SEQNO = '2'";

if(MONTHS_BETWEEN(startdate , enddate ){

  //Conditions here
}

我想比较两个 sql 语句之间是否有一个月的差异。

“过程”是指 PL/SQL。 所以,就那样做吧。

只是想知道日期代表什么:

SQL> alter session set nls_date_format = 'dd.mm.yyyy';

Session altered.

表格内容:

SQL> select * From systemparam;

     SEQNO SYSTEMDATE
---------- ----------
         1 04.04.2021
         2 05.04.2021

匿名 PL/SQL 块:

SQL> set serveroutput on
SQL> declare
  2    l_startdate systemparam.systemdate%type;
  3    l_enddate   systemparam.systemdate%type;
  4  begin
  5    select s.systemdate
  6      into l_startdate
  7      from systemparam s
  8      where s.seqno = 1;
  9
 10    select s.systemdate
 11      into l_enddate
 12      from systemparam s
 13      where s.seqno = 2;
 14
 15    if months_between(l_enddate, l_startdate) > 0 then
 16       dbms_output.put_line('Dates are not equal');
 17    end if;
 18  end;
 19  /
Dates are not equal

PL/SQL procedure successfully completed.

SQL>

但是,如果这两个日期之间有任何“月”(“0.01”月之间仍然是“月之间”,尽管很小),那么它们不相等,因此使用if l_enddate <> l_startdate then可能更明显相反,不是吗? 另外,检查SELECT语句的另一个选项:

SQL> declare
  2    l_startdate systemparam.systemdate%type;
  3    l_enddate   systemparam.systemdate%type;
  4  begin
  5    select max(case when s.seqno = 1 then s.systemdate end),
  6           max(case when s.seqno = 2 then s.systemdate end)
  7      into l_startdate,
  8           l_enddate
  9    from systemparam s;
 10
 11    if l_enddate <> l_startdate then
 12       dbms_output.put_line('Dates are not equal');
 13    end if;
 14  end;
 15  /
Dates are not equal

PL/SQL procedure successfully completed.

SQL>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM