2017-04-12 53 views
0

Oracle SQL * Plus(以及SQL Developer)不支持将变量声明为日期(Citation)。在变量中捕获日期的适当方法?

所以我可以选择到一个varchar,但它需要我转换为一个字符串。然后它不再是一个日期,我不能对它进行日期算术。

使用日期变量的适当方式是什么?我在BEGIN/END的开始处使用变量而不是声明,因为我需要它们在块外部可用,以使选择容易显示。

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; 

回答

2

你需要使用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

+0

“SqlPlus限制”,所以我没有使用SQL * Plus客户端(抱歉不提),我正在使用SQL Developer。即使您不使用该特定客户端,也许BEGIN/END块之外的所有内容都被视为“SqlPlus”?你能澄清一下吗?当我回到PC时,我会尝试解决您的问题。 – AaronLS

+2

@AaronLS - 适用于SQL \ * Plus的大多数东西也适用于SQL Developer。这当然。 –

0

这确实或多或少同样的事情:

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,所以你可能在同一个旅程中。

+0

谢谢。 “我在使用变量而不是在BEGIN/END开始处声明,因为我需要它们在块之外,使得选择容易显示。”使用dbms_output或游标会很快变得乏味。 – AaronLS