我是使用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
提前感谢!!
我想你是在:
select *
from my_table
where disp_cret_dt >= trunc(sysdate-1);
假设disp_cret_dt的数据类型为DATE或TIMESTAMP。
在Oracle中,两个日期之间的差异(包括时间)总是作为差天数返回-并且它可以包含一天的一部分(例如。今天中午12点-今天午夜= 0.5)。
SYSDATE是Oracle返回当前日期+时间的方式。
TRUNC(dt, level)是您可以将日期截断到您喜欢的任何级别的方式-默认是天(这会将时间重置为午夜- 00:00),但您可以使用月(将时间恢复到每月的第一天),小时等。
下面是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中选择collections来获取更多信息。
如果您希望将"yesterday"放在单独的变量中,因为您在代码中多次使用它,请为其分配"sysdate-1":
declare
yesterday date := trunc(sysdate - 1);
begin
select * from my_table where disp_cret_dt >= yesterday;
end;