我从解码codebar-128收到一个字符串,一旦我解析了所读代码中的所有数据,我就会得到一个奇怪的4位数格式的日期:“yddd”
“y”数字表示一年中的最后一个数字(0-9)。“ddd”数字表示一年中的某一天(1-366)。
问题是年份的模糊值。解决这一问题的规则必须如下:
为“y”数字计算的年份必须是距离sysdate年份最近的年份。
“y”数字的sysdate year和computed year之差永远不会大于4。
我的代码:
SELECT SYSDATE, TO_DATE('0213', 'YDDD'), TO_DATE('1212', 'YDDD'),
TO_DATE('2212', 'YDDD'), TO_DATE('3212', 'YDDD'), TO_DATE('4213', 'YDDD'),
TO_DATE('6212', 'YDDD'), TO_DATE('7212', 'YDDD'), TO_DATE('8213', 'YDDD'),
TO_DATE('9212', 'YDDD')
FROM dual;
这是我需要得到的:
+-----------+--------------------------+--------------------------+--------------------------+--------------------------+--------------------------+--------------------------+--------------------------+--------------------------+--------------------------+
| SYSDATE | TO_DATE('20213','YYDDD') | TO_DATE('21212','YYDDD') | TO_DATE('22212','YYDDD') | TO_DATE('23212','YYDDD') | TO_DATE('24213','YYDDD') | TO_DATE('16213','YYDDD') | TO_DATE('17212','YYDDD') | TO_DATE('18212','YYDDD') | TO_DATE('19212','YYDDD') |
+-----------+--------------------------+--------------------------+--------------------------+--------------------------+--------------------------+--------------------------+--------------------------+--------------------------+--------------------------+
| 26-JUN-20 | 31-JUL-20 | 31-JUL-21 | 31-JUL-22 | 31-JUL-23 | 31-JUL-24 | 31-JUL-16 | 31-JUL-17 | 31-JUL-18 | 31-JUL-19 |
+-----------+--------------------------+--------------------------+--------------------------+--------------------------+--------------------------+--------------------------+--------------------------+--------------------------+--------------------------+
如你所见,如果我有一年倒数第二位的数字,就没有问题了。
这是我真正得到的:
+-----------+------------------------+------------------------+------------------------+------------------------+------------------------+------------------------+------------------------+------------------------+------------------------+
| SYSDATE | TO_DATE('0213','YDDD') | TO_DATE('1212','YDDD') | TO_DATE('2212','YDDD') | TO_DATE('3212','YDDD') | TO_DATE('4213','YDDD') | TO_DATE('6212','YDDD') | TO_DATE('7212','YDDD') | TO_DATE('8213','YDDD') | TO_DATE('9212','YDDD') |
+-----------+------------------------+------------------------+------------------------+------------------------+------------------------+------------------------+------------------------+------------------------+------------------------+
| 26-JUN-20 | 31-JUL-20 | 31-JUL-21 | 31-JUL-22 | 31-JUL-23 | 31-JUL-24 | 31-JUL-26 | 31-JUL-27 | 31-JUL-28 | 31-JUL-29 |
+-----------+------------------------+------------------------+------------------------+------------------------+------------------------+------------------------+------------------------+------------------------+------------------------+
3条答案
按热度按时间3mpgtkmj1#
将它拆分为多个with子句,以便更容易理解,如果需要,可以将它连接到单个查询中。
pdtvr36n2#
您可以将单个数字值与当前年份的最后一个数字进行比较,如果差值大于4,则调整10年。但它需要双向发展;一旦“今天”是2026年,你就要多活10年。
这就得到了
我还没有验证未来一年的行为,所以你可能需要测试和调整,如有必要。
u0sqgete3#
这会给你一些想法:
如果你需要转换成许多变量,我的建议是创建一个确定性函数。
当做。