我正在尝试制作反向日历。也就是说,当提供正常日期时,它可以区分日期与月末的日期。
t_calendar只是我使用的临时日历,它有日期,但我想更新它并将inverse_day和inverse_week_of_month列设置为反向日期。
我在MSQL上成功完成了以下操作:
UPDATE @t_calendar
SET inverse_day = b.max_day_of_month - a.day + 1,
inverse_week_of_month = ( b.max_day_of_month - a.day ) / 7 + 1
FROM @t_calendar a
INNER JOIN ( SELECT year, month, MAX( day ) max_day_of_month FROM @t_calendar GROUP BY year, month ) b ON b.year = a.year AND b.month = a.month;
我在pl / sql中做了类似的工作:
UPDATE t_calendar a
SET inverse_day = customDate1.max_day - a.day + 1,
inverse_week_of_month = TRUNC(( customDate1.max_day - a.day ) / 7) + 1
WHERE customDate1.year = a.year AND customDate1.month = a.month;
但它非常慢,即如果MSQL需要2秒,pl / sql将需要几分钟。所以这不是我认为的好解决方案。我尝试复制pl / sql上的MSQL代码,由于我的单元测试失败,它似乎与以前的工作方式不同:
UPDATE t_calendar
SET (inverse_day, inverse_week_of_month) = (
SELECT b.max_day_of_month - a.day + 1, TRUNC(( b.max_day_of_month - a.day ) / 7) + 1
FROM t_calendar a
inner JOIN ( SELECT year, month, MAX( day ) max_day_of_month FROM t_calendar GROUP BY year, month ) b
ON b.year = a.year AND b.month = a.month
where rownum <= 1);
我可以用什么方法在pl / sql中对此进行优化,因为我对它很新,或者使连接按预期工作。
答案 0 :(得分:2)
我认为你的第二个和第三个片段与第一个片段没有相同的逻辑。相当于Oracle SQL中的第一个片段(不是PL / SQL,这是Oracle的程序语言)将是:
UPDATE t_calendar a
SET (inverse_day, inverse_week_of_month) =
( SELECT max(b.day) - a.day + 1, TRUNC(( max(b.day) - a.day ) / 7) + 1
FROM t_calendar b
WHERE b.year = a.year
AND b.month = a.month
) u
像这样的t_calendar
的索引也可能会有所帮助:
CREATE INDEX ON t_calendar ( year, month, day desc )
抱歉,我不在Oracle数据库前面检查语法错误等。