【发布时间】:2020-06-26 09:02:31
【问题描述】:
我从解码 codebar-128 收到一个字符串,一旦我解析读取的代码中的所有数据,我会得到一个奇怪的 4 位数格式的日期:'YDDD'
“Y”数字代表年份的最后一位数字 (0-9)。 “DDD”数字表示一年中的第几天 (1-366)。
问题在于 Year 的值不明确。解决该问题的规则必须如下:
- 为“Y”数字计算的年份必须是最接近 Sysdate 年份的年份。
- “Y”数字与 Sysdate 年份和计算年份的差永远不会大于 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 |
+-----------+------------------------+------------------------+------------------------+------------------------+------------------------+------------------------+------------------------+------------------------+------------------------+
【问题讨论】:
-
如果您的规则 (1) 和 (2) 适用,为什么 '1' 变成 2001 而不是 2021?那不是更接近今天,而且距离今天还有 4 年多的时间?我不确定这是否只是你如何生成它的问题。通过复制您实际获得的内容并进行必要的更改(可能会解释每一项)来显示您的预期输出可能会有所帮助?
-
@AlexPoole 你没事! “1”必须是“2021”。我已经修好了。
-
不用说您应该尽快将您的设计更改为正确的
DATE(或TIMESTAMP)数据类型。
标签: sql oracle sql-function to-date sql-date-functions