PostgreSQL日期格式中:Mi报错,寻求替代转义方案
Node.js调用PostgreSQL时格式字符串冒号报错的解决方法
问题根源
你遇到的":Mi" has no value in the given object错误,本质不是PostgreSQL的语法问题,而是你使用的Node.js ORM(如Sequelize)会把SQL中的:xxx识别为参数占位符,试图从传入的参数对象中匹配对应键值。但格式字符串里的:Mi、:MI是PostgreSQL日期格式的语法,并非参数,所以ORM抛出了找不到对应值的错误。
替代转义方案(除||CHR(58)||外)
1. 双冒号转义
ORM通常会将连续两个冒号::解析为单个冒号,直接修改格式字符串即可:
select to_date(a.game_date|| ' ' ||a.game_time, 'yyyy-MM-dd HH24::Mi') as "beginTime", a.game_id "gameId"
to_char(to_timestamp(t/1000), 'YYYY-MM-DD"T"HH24::MI::SS"Z"')
2. 关闭ORM的参数解析
如果是执行原生SQL查询,可以显式关闭ORM的参数替换逻辑。比如在Sequelize中调用sequelize.query()时,传入配置项禁用参数解析:
sequelize.query( 'select to_date(a.game_date|| \' \' ||a.game_time, \'yyyy-MM-dd HH24:Mi\') as "beginTime", a.game_id "gameId"', { raw: true, replacements: {} } );
关于PostgreSQL E'foo'语法的说明
PostgreSQL的E'...'语法是用于处理反斜杠转义的扩展字符串(比如E'\t'表示制表符),它不负责转义冒号。你尝试的E'yyyy-MM-dd HH24:Mi'无效,因为冒号的解析发生在ORM层面,还没到PostgreSQL执行阶段。
内容的提问来源于stack exchange,提问作者3960278
相关产品推荐
相关产品推荐

