sql - ORA-01839: 日期对于指定月份无效,如何避免闰年问题
问题描述
我有一个表格,为每个人存储一个有效的“自定义日期”。该日期可能是闰年的 2 月 29 日。事情在我的报告的 SQL 中,我需要从该员工最近一年的自定义日期字段中提取“最后一个”mm/dd。这个日期永远不会在未来,所以我可以比较日期中的年份以及当前年份是否按原样拉动。但是,如果是前一年(可以追溯到 1900 年),我需要改为从去年开始拉该 MM/DD。所以你可以看到这将是一个问题,因为没有 2018 年 2 月 29 日。
我正在寻找如何处理这个问题的最佳解决方案。我在我的选择部分和条件块中需要它,我试图导出的这个日期必须是 >= applydtm 日期。这是一个复制错误的示例查询。只需将 2 月 29 日日期切换到 2 月 28 日将显示它工作,因为它没有遇到无效的闰年日期。如果需要,只要代码尽可能高效,我可以将所有 2 月 29 日的日期“转换”到 3 月 1 日。DB = 甲骨文 11g
WITH sampledata (actualcustomdtm, textfield, applydtm) AS (
SELECT
TO_DATE('02/29/2012 00:00:00','mm/dd/yyyy hh24:mi:ss'),
'Leap Year',
sysdate
FROM dual
UNION
SELECT
TO_DATE('01/15/2019 00:00:00','mm/dd/yyyy hh24:mi:ss'),
'Non-Leap Year',
sysdate
FROM dual
)
SELECT
actualcustomdtm,
CASE WHEN TO_CHAR(actualcustomdtm, 'YYYY') = TO_CHAR(SYSDATE, 'YYYY')
THEN TO_CHAR(actualcustomdtm, 'MM/DD/YYYY')
ELSE TO_CHAR(actualcustomdtm, 'MM/DD')||'/'||TO_CHAR(ADD_MONTHS(TRUNC(SYSDATE), -12), 'YYYY')
END AS "LASTACTCSTMDATE",
textfield,
applydtm
FROM sampledata
WHERE applydtm >=
TO_DATE(CASE WHEN TO_CHAR(actualcustomdtm, 'YYYY') = TO_CHAR(SYSDATE, 'YYYY')
THEN TO_CHAR(actualcustomdtm, 'MM/DD/YYYY')
ELSE TO_CHAR(actualcustomdtm, 'MM/DD')||'/'||TO_CHAR(ADD_MONTHS(TRUNC(SYSDATE), -12), 'YYYY')
END, 'MM/DD/YYYY')
解决方案
我相信这种逻辑可以满足您的要求-将最近的周年纪念日设为或包括今天的日期:
select dte, add_months(dte, 12),
(case when to_char(dte, 'MMDD') > to_char(sysdate, 'MMDD')
then add_months(dte, 12 * (extract(year from sysdate) - extract(year from dte) - 1))
else add_months(dte, 12 * (extract(year from sysdate) - extract(year from dte)))
end)
from (select date '2016-02-29' as dte from dual union all
select date '2018-01-03' from dual
) x;
推荐阅读
- r - 使用闪亮的输入、文本和希腊字母向 ggplot 添加标题
- apache-kafka - Kafka消费者可以从所有分区消费吗
- python - 在循环中解析嵌套的 json 数据
- sql - 仅选择一行,按值字段,排序
- python-3.x - 防止 if、elif、else 链(检查输入)
- python - dbsf 中的数据砖写入 xlsx(数据砖文件系统)
- python - 在 Python 中的单个图表中绘制来自不同数据帧的行
- vb.net - 如何捕捉应用程序崩溃/不正常退出?
- powerapps - 计算在 PowerApps 中输入的每个数量的总金额
- excel - 将系统从 Windows8 32 位更新到 Windows10 64 位后 Excel 宏不起作用