PostgreSQL新手求助:获取6个月前月份西班牙语名称的查询返回空行
解决PostgreSQL获取6个月前西班牙语月份名称的问题
嘿,我来帮你搞定这个问题!你的查询返回空行主要有几个原因,我一步步给你拆解,再给你更简洁的解决方案:
现有查询的问题
- 月份名称带空格导致匹配失败:
to_char(..., 'Month')返回的月份名称是带末尾空格的(比如'January '而不是'January'),所以你的CASE条件永远匹配不上,结果就是NULL,看起来像空行。 - 映射错误:你把July对应的西班牙语写成了
Junio,正确的应该是Julio;另外May的西班牙语是Mayo,不是May哦。 - 不必要的表查询:你从
recibopagoderechoslaborales表查询,如果这个表是空的,自然返回空行——其实你不需要关联这个表,直接执行SELECT语句就能得到结果。
方案1:修正你的CASE语句
先处理空格问题,修正映射错误,去掉不必要的表查询:
SELECT CASE trim(to_char(current_date - interval '6 Month', 'Month')) WHEN 'January' THEN 'Enero' WHEN 'February' THEN 'Febrero' WHEN 'March' THEN 'Marzo' WHEN 'April' THEN 'Abril' WHEN 'May' THEN 'Mayo' WHEN 'June' THEN 'Junio' WHEN 'July' THEN 'Julio' WHEN 'August' THEN 'Agosto' WHEN 'September' THEN 'Septiembre' WHEN 'October' THEN 'Octubre' WHEN 'November' THEN 'Noviembre' WHEN 'December' THEN 'Diciembre' END AS "Hace 6 Meses";
这里用trim()去掉了to_char返回的空格,同时修正了两个映射错误,直接执行就能得到正确结果。
方案2:利用PostgreSQL本地化(更优雅)
PostgreSQL支持直接通过本地化设置输出对应语言的月份名称,不用写冗长的CASE语句:
-- 临时设置当前会话的时间格式语言为西班牙语 SET lc_time TO 'es_ES.UTF-8'; -- 使用FMMonth去掉末尾空格,直接获取西班牙语月份名称 SELECT to_char(current_date - interval '6 Month', 'FMMonth') AS "Hace 6 Meses";
FM修饰符的作用是去掉Month格式自带的填充空格,避免方案1里的trim操作。- 如果你的数据库没有
es_ES.UTF-8locale,可能需要先安装(大部分现代PostgreSQL默认自带)。 - 如果不想临时修改会话设置,也可以在查询里直接指定:
SELECT to_char(current_date - interval '6 Month', 'FMMonth') AS "Hace 6 Meses" FROM set_config('lc_time', 'es_ES.UTF-8', true);
这样就能轻松得到你想要的西班牙语月份名称啦!
内容的提问来源于stack exchange,提问作者Errol Chaves Moya
相关产品推荐
相关产品推荐

