首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NEXT_DAY函数在SQL和PL/SQL中的工作方式不同吗?

NEXT_DAY函数在SQL和PL/SQL中的工作方式不同吗?
EN

Stack Overflow用户
提问于 2017-03-29 21:43:36
回答 2查看 1.7K关注 0票数 6

为什么这个SQL查询工作:

代码语言:javascript
复制
SELECT NEXT_DAY(SYSDATE, 7)
FROM DUAL;

NEXT_DAY(SYSDATE,7)

...but这个匿名的PL/SQL块不起作用吗?

代码语言:javascript
复制
DECLARE
  dteExpires DATE;
BEGIN
  dteExpires := NEXT_DAY(SYSDATE, 7);
END;

错误出现在第1行ORA-01846:不是一周中有效的一天或06512:在第4行。

我不想硬编码第二个参数到英文名字的前一天。NEXT_DAY(SYSDATE, 'SATURDAY')NEXT_DAY(SYSDATE, 'SUNDAY')等。

现在,我将使用以下工作,但我非常想知道为什么NEXT_DAY()在PL/SQL中的行为与在SQL中的行为不同。

代码语言:javascript
复制
DECLARE
  dteExpires DATE;
BEGIN
  -- 2017-01-01 = SUNDAY
  dteExpires := NEXT_DAY(SYSDATE, TO_CHAR(TO_DATE('2017-01-01', 'YYYY-MM-DD'), 'DAY'));
END;

这是我的DEV环境:

代码语言:javascript
复制
SELECT *
FROM v$version;

OracleDatabase12c企业版版本12.1.0.2.0 -64位生产PL/SQL版本12.1.0.2.0 -生产核心12.1.0.2.0生产TNS为64位Windows:版本12.1.0.2.0 -生产NLSRTL版本12.1.0.2.0 -生产5行选定。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-29 22:29:58

如果您检查SQL的NEXT_DAY文档,您会发现传入一个数字来表示一周中的一天是没有文档记录的。它可以工作,不管出于什么原因,但是如果您依赖它工作,那么您将冒这样的风险:将来Oracle将更改实现以符合该函数的指定规范。(风险很小,因为Oracle并不疯狂。)

https://docs.oracle.com/database/121/SQLRF/functions118.htm#SQLRF00672

PL/SQL实现只适用于文档规范--它不接受表示一周中某一天的数字输入。

我想这是一个间接的答案。我相信你问错了问题。问题不应该是“为什么这个在PL/SQL中不能工作”,而是考虑到文档,问题应该是“为什么它在Oracle SQL中工作”。只有甲骨文才能回答这个问题。

您可能会发现OTN上的讨论很有用:https://community.oracle.com/thread/4023654

也许这个也是:https://community.oracle.com/ideas/17257?tab=comment

票数 4
EN

Stack Overflow用户

发布于 2017-03-30 05:46:32

我认为使函数NEXT_DAY独立于当前会话NLS_DATE_LANGUAGE的唯一方法是使用ISO week,而每周的第一天总是在星期一:

代码语言:javascript
复制
SELECT NEXT_DAY(SYSDATE, TO_CHAR(TRUNC(SYSDATE, 'IW')+5, 'Day')) 
from dual;

TRUNC(SYSDATE, 'IW')+5的意思是“下星期六”

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43104695

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档