在Oracle中声明YESTERDAYS Date作为变量

时间:2015-07-20 10:29:58

标签: oracle datetime set toad declare

我对使用Oracle非常陌生(我使用的是TOAD 11.6),我想将这些代码转换成可以在Oracle中运行的代码,我该怎么做?!

declare @yesterday  datetime
set     @yesterday  =   (select cast(cast(getdate() as varchar(12)) as datetime)-1)

select  *
from    my_table
where   disp_cret_dt    >=  @yesterday

提前致谢!!

3 个答案:

答案 0 :(得分:2)

我想你是在追求:

select *
from   my_table
where  disp_cret_dt >= trunc(sysdate-1);

假设disp_cret_dt的数据类型为DATE或TIMESTAMP。

在Oracle中,两个日期(包括时间)之间的差异总是以天数差异的形式返回 - 它可以包含一天中的一小部分(例如,今天中午12点 - 今天午夜= 0.5)。 / p>

SYSDATE是Oracle返回当前日期+时间的方式。

TRUNC(dt,level)是你可以将日期截断到你喜欢的任何级别的方式 - 默认为日期(只将时间重置为午夜 - 00:00),但你可以做一个月(拿它回到本月的第一天),小时等等。

答案 1 :(得分:1)

以下是oracle的等效代码

declare yesterday  date;
    begin
    select to_char(sysdate-1,'dd/mm/yyyy hh:mi:ss') into yesterday from dual;
    select * into var1,var2..varn from my_table 
    where disp_cret_dt>=yesterday;
    end;

1.Dual是oracle中的临时表,其中包含一个名为dummy的列,数据类型为varchar2(1)。有关更多信息,请参阅此处。

2. SQL的SELECT INTO子句用于从Oracle数据库中检索一行或一组列。 SELECT INTO实际上是一个标准的SQL查询,其中SELECT INTO子句用于将返回的数据放入预定义的变量中。

如果你想返回三个项目,你需要在我们的pl / sql块中定义三个变量,并将这些变化应用到上面的代码后看起来

declare 
yesterday  date;
v_item1 number;
v_item2 varchar2(11);
v_item3 date;
    begin
    select to_char(sysdate-1,'dd/mm/yyyy hh:mi:ss') into yesterday from dual;
    select  item1, item2,item3 into v_item1,v_item2,v_item3 from my_table 
    where disp_cret_dt>=yesterday;
Dbms_output.put_line('Item1: '||v_item1||'Item2: '||v_item2||'Item3: '||v_item3);--Displaying values
    end;

注意:在上面的代码中,如果您的select查询将为每个昨天的值返回多行,那么它将引发错误。因为变量一次只能保存一个值。在那种情况下,我们必须在oracle中选择集合以获取更多信息。请参阅此处。

答案 2 :(得分:0)

如果您想在单独的变量中使用“昨天”,因为您在代码中多次使用它,请为其指定“sysdate-1”:

declare
  yesterday date := trunc(sysdate - 1);
begin
  select * from my_table where disp_cret_dt >= yesterday;
end;