在Oracle/PLSQL中增加Datetime时出错

Nav*_*jum 2 oracle plsql oracle11g oracle12c

在这里,我使用从StartDateTime到EndDatetime的循环,并在每次迭代中添加1小时.一切都在Loop.But问题是在插入查询.请检查插入查询.

declare
StartDateTime   TIMESTAMP :=to_date( '2017-01-01 00:00:00','yyyy-mm-dd       
hh24:mi:ss');
EndDateTime   TIMESTAMP :=to_date( '2017-12-31 00:00:00','yyyy-mm-dd 
hh24:mi:ss');
dateti TIMESTAMP;
dateti2 TIMESTAMP;
StartDateTime1 TIMESTAMP;
sub INTEGER;
semester Number;
begin

sub:=( CAST( EndDateTime AS DATE ) - CAST( StartDateTime AS DATE ) )  ;

FOR i IN  0 .. 1
LOOP
StartDateTime1:=StartDateTime+i;
for idx in 0..2 loop
dateti:=to_date(StartDateTime1+(idx/24.0),'yyyy-mm-dd hh24:mi:ss');
dateti2:=to_date(StartDateTime1+((idx+1)/24.0)+ interval '-1' second,'yyyy-
mm-dd hh24:mi:ss');

      case 
        when to_number(to_char(dateti ,'Q'))>6 then semester:=to_number(2);
       else semester:=to_number(1);
        end case;
Run Code Online (Sandbox Code Playgroud)

问题从插入查询开始.它说非数字字符找到.DateSlotStart和DateSlotEnd数据类型是Timestramp.请看图像并告知我应该更改什么?

在此输入图像描述

  insert into DimDate1(DateSlotStart,DateSlotEnd,
  "Date",SlotName,MonthName,MonthNumberOfYear,Quarter,Year,Semester) values 
   (to_date(dateti ,'yyyy-mm-dd hh24:mi:ss') ,to_date(dateti2 ,'yyyy-mm-dd 
    hh24:mi:ss') ,
   to_date(dateti ,'yyyy-mm-dd'),to_char(dateti ,'hh24:mi' )||' To 
   '||to_char(dateti2 ,'hh24:mi' ),to_char(dateti 
    ,'Month'),to_number(to_char(dateti ,'mm')),to_number(to_char(dateti ,'Q')),
  to_number(to_char(dateti ,'YYYY')) , semester);

end loop;


   END LOOP;
  end;
/
Run Code Online (Sandbox Code Playgroud)

请检查一下 在此输入图像描述

Kau*_*yak 5

问题是您正在尝试将TIMESTAMP日期转换为不需要的日期.CAST当你需要将它转换为时,总是更好DATE.用这个替换你的插入.它应该工作.

   INSERT INTO dimdate1 (
        dateslotstart,
        dateslotend,
        "Date",
        slotname,
        monthname,
        monthnumberofyear,
        quarter,
        year,
        semester
    ) VALUES (
        dateti,
        dateti2,
        CAST (dateti AS DATE),
        TO_CHAR(dateti,'hh24:mi')
        || ' To '
        || TO_CHAR(dateti2,'hh24:mi'),
        TO_CHAR(dateti,'Month'),
        to_number(TO_CHAR(dateti,'mm') ),
        to_number(TO_CHAR(dateti,'Q') ),
        to_number(TO_CHAR(dateti,'YYYY') ),
        semester
    );
Run Code Online (Sandbox Code Playgroud)

  • 它与插入或转换无关.您必须检查是否正在使用PL/SQL代码进入无限循环. (2认同)