1

请帮帮我,DAY_ID 是包含 1-7 个数字的数据库字段。1 代表星期一,2 代表星期二,依此类推。

DECLARE
V_DAY_ID NUMBER(1) :=0;
BEGIN
SELECT DAY_ID INTO V_DAY_ID FROM DAYS WHERE DAY_NAME = TO_CHAR(SYSDATE,'DAY');
END;

此查询无效,请帮助...

4

2 回答 2

5

默认情况下,Oracle 将日期名称填充到会话日期语言中最长的日期(因此英文为 9)。您可以使用FMmodifer覆盖它。

Day还需要匹配大小写,并使用您显示的值(例如'Sunday')而不是DAY('SUNDAY'):

TO_CHAR(SYSDATE,'FMDay')

或者如果这些值实际上是大写的(你已经显示了两个!):

TO_CHAR(SYSDATE,'FMDAY')

但是您也不应该假设任何调用它的人在他们的会话中使用英语,请指定您希望英语日期名称以确保它与您的表中的内容匹配:

TO_CHAR(SYSDATE,'FMDAY','NLS_DATE_LANGUAGE=''ENGLISH''')

SQL Fiddle 演示

格式模型在文档中进行了描述

于 2018-07-08T08:13:28.193 回答
1

您的 DAY_NAME 未以大写形式保存,因此在条件中添加UPPER函数(以及 TRIM 值以忽略空格)

DECLARE
V_DAY_ID NUMBER(1) :=0;
BEGIN
SELECT DAY_ID INTO V_DAY_ID FROM DAYS WHERE UPPER(DAY_NAME) = TRIM(TO_CHAR(SYSDATE,'DAY'));
END;
于 2018-07-08T08:08:57.523 回答