You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Oracle SQL中将日期转换为波斯历(Shamsi)格式?

解决Oracle日期转波斯历(Shamsi)的问题

你的问题出在没有先将字符串显式转换为公历日期,直接传递字符串给TO_CHAR时,Oracle会用会话默认的日期格式隐式解析字符串,而nls_calendar=persian参数只作用于格式化步骤,不影响字符串的解析过程。

正确的查询语句

要得到你期望的20-03-97结果,需要先把字符串转换成公历的DATE类型,再用TO_CHAR指定波斯历格式:

SELECT TO_CHAR(TO_DATE('10-JUN-18', 'DD-MON-RR'), 'dd-mm-yy', 'nls_calendar=persian') FROM dual;

额外的鲁棒性优化

如果你的数据库会话默认日期语言不是英语,JUN这个月份缩写可能无法被正确解析,建议加上NLS_DATE_LANGUAGE参数确保解析准确:

SELECT TO_CHAR(TO_DATE('10-JUN-18', 'DD-MON-RR', 'NLS_DATE_LANGUAGE=ENGLISH'), 'dd-mm-yy', 'nls_calendar=persian') FROM dual;

为什么原代码不生效?

原代码中'10-JUN-18'是字符串,Oracle会先尝试将它隐式转换为DATE类型,但这个转换过程使用的是会话的NLS_DATE_FORMAT设置,而非你指定的波斯历参数。只有当字符串被正确解析为公历的2018年6月10日后,再用nls_calendar=persian格式化,才能得到对应的波斯历日期1397年3月20日(即20-03-97)。

内容的提问来源于stack exchange,提问作者Sara Moradi

火山引擎 最新活动