You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 03:36:02