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
相关产品推荐
相关产品推荐

