Oracle SQL如何从指定日期字段中正确提取对应星期几?
错误原因
DATEPART 是SQL Server专属的日期处理函数,Oracle原生不支持该函数,因此会抛出PLS-00201: 标识符 'DATEPART' 必须声明的错误。你之前尝试的TO_CHAR写法也存在参数错误:第二个格式参数不能同时指定MM/dd/yyyy和DAY,且PL/SQL中可以直接调用内置函数,不需要嵌套SELECT从DUAL查询。
正确提取星期几的实现方式
Oracle中提取日期的星期几使用TO_CHAR函数即可,常用两种判断逻辑:
方式1:按星期数字判断
和你原有逻辑兼容,Oracle中TO_CHAR(日期, 'D')会返回1-7的数字,默认规则为周日=1、周一=2、……、周六=7,刚好匹配你原来DATEPART(dw, 日期)=2代表周一的判断逻辑:
IF TO_NUMBER(TO_CHAR(vPracownik.zatrudniony, 'D')) = 2 THEN
如果担心数据库的NLS设置修改了星期起始规则,可以用下面的名称判断方式规避兼容问题。
方式2:按星期名称判断
直接匹配星期的英文名称,通过参数指定日期语言避免数据库默认语言影响:
IF TRIM(TO_CHAR(vPracownik.zatrudniony, 'DAY', 'NLS_DATE_LANGUAGE=AMERICAN')) = 'MONDAY' THEN
注意:这里加
TRIM是因为TO_CHAR返回的星期名称会自动补空格对齐最长的星期名字符长度,不去除空格会导致匹配失败。
修正后完整代码
DECLARE CURSOR cPracownicy IS SELECT * FROM Pracownicy FOR UPDATE; vPracownik Pracownicy%ROWTYPE; BEGIN FOR vPracownik IN cPracownicy LOOP -- 替换为正确的星期判断逻辑即可 IF TO_NUMBER(TO_CHAR(vPracownik.zatrudniony, 'D')) = 2 THEN UPDATE Pracownicy SET placa_pod = 1.2 * placa_pod WHERE CURRENT OF cPracownicy; DBMS_OUTPUT.PUT_LINE( vPracownik.nazwisko || vPracownik.placa_pod ); END IF; END LOOP; END;
内容的提问来源于stack exchange,提问作者code_rushh
相关产品推荐
相关产品推荐

