一个表中包含日期型字段,使用lag或lead函数时,若lag/lead的第一个参数为日期型字段,会报错“ORA-00932:不一致的数据类型:要求DATE 得到的却是 NUMBER”。百思不得其解,将日期型字段用to_char换成字符串后,再调用没有问题(若要得到日期再用to_date转化,代码上稍微麻烦一点)
测试用例:
SELECT seq
,t.mydate
--,lag(t.mydate, 1, 0) over (ORDER BY mydate)
--,lead(t.mydate, 1, 0) over (ORDER BY t.seq) -- 报错ORA-00932
,lead(to_char(t.mydate, 'yyyy-mm-dd')) over (ORDER BY t.mydate ASC) -- 执行正确
FROM
(
SELECT ROWNUM seq, (to_date('1900-01-01', 'yyyy-mm-dd') + ROWNUM) mydate -- 开始日期加上N天
FROM ALL_OBJECTS
WHERE 1 = 1
AND ROWNUM < 1000
) t