nev*_*ind 0 sql database oracle plsql date
我的DW中有一个TIME维度,我想添加一个阵营来填补今年的赛季.我想做这样的事情:
create or replace
PROCEDURE "PROC_UPDATE_SEASON"
IS
CURSOR curs IS
SELECT * FROM indw.time FOR UPDATE;
cur_d NUMBER;
cur_m NUMBER;
start_d NUMBER;
start_m NUMBER;
end_d NUMBER;
end_m NUMBER;
cur_Date DATE;
BEGIN
FOR cs IN curs
LOOP
cur_d := to_number(to_char(cs.time_DAY,'dd'));
cur_m := to_number(to_char(cs.time_DAY,'mm'));
cur_date:= cs.time_DAY; -- this is my date dd-mm-yyyy or dd/mm/yyyy
if ((cur_date in format dd/mm is >= 21/12 and <=31/12) OR cur_date>=01/01 and <=20/03)
UPDATE time t set t.time_SEASON = 'Winter' WHERE CURRENT OF curs;
else if cur_date_in format dd/mm is between a date and another then it's Spring)
-- and so on ...
END LOOP;
END;
Run Code Online (Sandbox Code Playgroud)
有没有办法使用to_char和to_date来实现这一目标?我正在尝试,但总是得到错误:(分别比较月份和日期将是一个巨大的,IMO,愚蠢的工作.
你能给我一些提示吗?
我真的只使用像dd/mm <= another_date_with_only_day_and_month这样的东西
不需要游标和循环:
update indw.time
set t.time_SEASON = case
when to_char(time_DAY,'MMDD') between '1221' and '1231'
or to_char(time_DAY,'MMDD') between '0101' and '0320'
then 'Winter'
when ...
end
Run Code Online (Sandbox Code Playgroud)
更妙的是,在Oracle 11g中,你可以在虚拟列添加到基于该CASE表达式表格,使得每一行自动拥有正确的time_season无需进行更新.
| 归档时间: |
|
| 查看次数: |
2476 次 |
| 最近记录: |