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

Vertica中如何将星期名称转换为星期数字?

嘿,这个需求我之前在项目里也碰到过,PostgreSQL确实没有直接的TO_NUMBER('MONDAY', 'DAY')这种用法,不过有几个简单可行的方案:

方法1:用CASE语句(最直观,自定义性强)

这是最稳妥的方式,完全不用依赖数据库的内置规则,你可以自己定义星期名称和数字的对应关系:

SELECT
  CASE TRIM(UPPER('MONDAY'))  -- TRIM是为了处理TO_CHAR返回的带空格的星期名,比如'MONDAY   '
    WHEN 'MONDAY' THEN 1
    WHEN 'TUESDAY' THEN 2
    WHEN 'WEDNESDAY' THEN 3
    WHEN 'THURSDAY' THEN 4
    WHEN 'FRIDAY' THEN 5
    WHEN 'SATURDAY' THEN 6
    WHEN 'SUNDAY' THEN 7  -- 你可以根据自己的需求调整数字,比如把周日设为1也没问题
  END AS day_number;

好处是不管数据库的语言环境是什么样,这个语句都能正常工作,而且逻辑一目了然。

方法2:利用日期函数自动转换(更简洁)

PostgreSQL的TO_DATE函数可以识别星期名称字符串,转成日期后再用dayofweek提取数字:

-- 注意:默认dayofweek()返回1=周日,2=周一,...,7=周六
SELECT dayofweek(TO_DATE(TRIM('MONDAY'), 'DAY'));

如果你的需求是让周一对应1(和你例子里的要求一致),可以对结果做个调整:

SELECT (dayofweek(TO_DATE(TRIM('MONDAY'), 'DAY')) + 5) % 7 + 1;

这个方法要注意数据库的语言设置,如果你的数据库默认不是英文,可能需要先执行SET lc_time = 'en_US.UTF-8';来确保能正确识别英文星期名称。

方法3:创建自定义函数(复用性高)

如果需要频繁转换,可以把逻辑封装成自定义函数,方便重复调用:

CREATE OR REPLACE FUNCTION day_name_to_number(day_name TEXT)
RETURNS INTEGER AS $$
BEGIN
  -- 这里实现的是周一=1,周日=7的映射,和你的例子匹配
  RETURN (dayofweek(TO_DATE(TRIM(UPPER(day_name)), 'DAY')) + 5) % 7 + 1;
END;
$$ LANGUAGE plpgsql;

-- 调用示例
SELECT day_name_to_number('MONDAY');  -- 返回1
SELECT day_name_to_number('SUNDAY');  -- 返回7

内容的提问来源于stack exchange,提问作者java-dev-ua

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 18:42:59