使用csvsql执行SQL查询时无法切换至MySQL dialect,出现函数报错
解决csvsql查询时SQLite不支持MONTH/YEAR函数的问题
问题分析
使用csvsql的--query参数执行查询时,工具默认采用SQLite作为底层引擎,但SQLite没有MySQL的MONTH()和YEAR()日期函数,因此会触发no such function: MONTH错误。同时无法通过--dialect mysql切换方言,因为该参数与--query互斥,会提示The --dialect option is only valid when neither --db nor --query are specified。
解决方案
改用SQLite原生的strftime()函数提取月份和年份,替代MySQL的MONTH()和YEAR()。SQLite的strftime()通过格式化字符串来获取日期组件:
%m:返回两位数字的月份(01-12)%Y:返回四位数字的年份
修改后的命令
csvsql -d ";" --query "SELECT ID_PROPOSTA FROM acomp_obras_contratos_medicoes_modulo_empresas WHERE strftime('%m', DATA_INICIO_MEDICAO_OBJETO_ACOMPANHAMENTO_OBRA) = '10' AND strftime('%Y', DATA_INICIO_MEDICAO_OBJETO_ACOMPANHAMENTO_OBRA) = '2010'" acomp_obras_contratos_medicoes_modulo_empresas.csv
补充说明
- 原命令中使用
LIKE匹配数值并不合适,直接用=进行字符串匹配更准确(因为strftime()返回的是字符串类型) - 确保CSV中的
DATA_INICIO_MEDICAO_OBJETO_ACOMPANHAMENTO_OBRA字段是SQLite可识别的日期格式(如YYYY-MM-DD、YYYY/MM/DD等),否则strftime()无法正常解析
内容的提问来源于stack exchange,提问作者Pedro
相关产品推荐
相关产品推荐

