低级错误真的浪费时间且菜,希望不再犯低级重复错误。
1.to_date()函数日期转换报错
SQL语句:
SELECT job_date FROM data_check
WHERE data_type = 'S';
查询结果:
job_date |
----------+
2023-01-28|
我希望用update语句更新job_date字段,但出现报错,就用SELECT语句查看问题。
我的SQL:
SELECT to_date('20230127','yyyy-mm-dd hh24:mi:ss') FROM data_check
WHERE data_type = 'S' ;
报错信息:
SQL 错误 [22008]: ERROR: date out of range: "20230127"
为什么报错?
在 PostgreSQL 中,to_date
函数用于将字符串转换为日期,"20230127" 不是有效的日期格式,因此导致了日期超出范围的错误。
在我的 SQL 查询中,to_date('20230127','yyyy-mm-dd hh24:mi:ss')
的日期格式为 'yyyy-mm-dd hh24:mi:ss',但是输入的字符串 "20230127" 并不符合该格式,因此 PostgreSQL 无法正确解析。
使用to_date函数时,转换格式需要和日期本来的格式相匹配
正确的SQL:
SELECT to_date('20230127', 'YYYYMMDD');
2.update /insert 语句中的字符串转义问题
假设我的列为column_a,现在需要对column_a进行更改,更改的文本如下所示:
'start_date < to_date('##某年度数据', 'yyyyMMdd') AND (CASE WHEN month IS NOT NULL AND other_month IS NOT NULL THEN CASE WHEN month > other_month THEN to_date(month, 'yyyyMMdd') ELSE to_date(other_month, 'yyyyMMdd') END WHEN month IS NULL THEN to_date(date3, 'yyyyMMdd') WHEN other_month IS NULL THEN month(date2, 'yyyyMMdd') END) < to_date('##某表年月', 'yyyyMMdd')'
在编辑窗口就感觉到文本中存在转义的问题,造成问题的原因是引号引起的。
解决方式是:在引号处多打一个引号
'start_date < to_date(''##某年度数据'', ''yyyyMMdd'') AND (CASE WHEN month IS NOT NULL AND other_month IS NOT NULL THEN CASE WHEN month > other_month THEN to_date(month, ''yyyyMMdd'') ELSE to_date(other_month, ''yyyyMMdd'') END WHEN month IS NULL THEN to_date(date3, ''yyyyMMdd'') WHEN other_month IS NULL THEN month(date2, ''yyyyMMdd'') END) < to_date(''##宽表活动月下限'', ''yyyyMMdd'')'
编辑窗口显示正常