在变量中捕获日期的适当方法?

Appropriate way to capture dates in variables?

Oracle SQL*Plus(因此 SQL 开发人员)不支持将变量声明为日期 (Citation)。

所以我可以 select 转换成 varchar,但它需要我转换成字符串。那么它就不再是真正的日期了,我无法对其进行日期运算。

处理日期变量的合适方法是什么?我在 BEGIN/END 的开头使用变量而不是声明,因为我需要它们在块外可用以使 selects 易于显示。

clear screen;
variable someid number; 
variable somedate varchar;
exec :someid := 1234; 

Begin
select c.some_timestamp into :somedate from someschema.sometable c
where c.someid = :someid ;
end;
/

select :somedate from dual;

如果你想做算术,你需要使用to_dateTO_TIMESTAMP

显然是SqlPlus限制。下面是一个例子:

variable my_date varchar2(30)

exec :my_date := '12-04-2017';

select * from mytable where date_col = to_date(:my_date,'dd-mm-yyyy');

看这里Declare a variable of type DATE using var

这或多或少做了同样的事情:

declare
  somedate date;
Begin
  select c.some_timestamp into somedate 
  from someschema.sometable c
  where c.someid = &someid ;
  dbms_output.put_line(somedate);
end;
/

显然,您需要在 运行 脚本之前启用 SERVEROUTPUT,但您可以使用 somedate 作为日期,而无需一直从字符串中转换它。


归根结底,这取决于您尝试做的事情的细节。我发现现在越来越少与 SQL*Plus 脚本进行交互:我使用 IDE 工作表来开发它们,然后一些 shell 程序自动执行它们。你说你正在使用 SQL Developer,所以你可能在同一个旅程中。