ERROR: column “xxx“ is of type date but expression is of type character varying

问题
### Cause: org.postgresql.util.PSQLException: ERROR: column "take_effect_start_time" is of type date but expression is of type character varying
  建议:You will need to rewrite or cast the expression.
  位置:193
; bad SQL grammar []; nested exception is org.postgresql.util.PSQLException: ERROR: column "take_effect_start_time" is of type date but expression is of type character varying
  建议:You will need to rewrite or cast the expression.
  位置:193] with root cause
org.postgresql.util.PSQLException: ERROR: column "take_effect_start_time" is of type date but expression is of type character varying
  建议:You will need to rewrite or cast the expression.
  位置:193
	at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2675)
	at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2365)
	at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:355)

使用MyBatis向PostgreSQL数据库插入数据,数据库类型是date,入参是string,报错。

解决
spring:
  datasource:
    druid:
      type: com.alibaba.druid.pool.DruidDataSource
      driverClassName: org.postgresql.Driver
      url: jdbc:postgresql://127.0.0.1:5432/bd?stringtype=unspecified
      username: root
      password: root

在配置url地址后面增加 stringtype=unspecified

原因

在最初实现该功能时考虑过使用Java代码拼接成sql,这样能够根据查询到的数据表列的字段类型来动态拼接,也能有使用一些数据库函数,在遇到该问题的时候也想使用这种方式解决,但时间日期类型的字符串格式多种多样,在使用一些数据库函数将字符串转成日期时需要指定其格式,这样的话就需要对日期字符串做各种格式的校验和转换。
stringtype=unspecified即自动格式化数据。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这个错误提示意味着你正在尝试将字符类型的值插入到一个 `timestamp` 类型的列中。你需要将字符类型的值转换为 `timestamp` 类型或者将列的类型改为 `character varying`。 如果你想将字符类型的值转换为 `timestamp` 类型,可以使用 `to_timestamp()` 函数。例如: ``` INSERT INTO my_table (cjsj) VALUES (to_timestamp('2021-08-01 12:00:00', 'YYYY-MM-DD HH24:MI:SS')); ``` 如果你想将列的类型改为 `character varying`,可以使用以下语句: ``` ALTER TABLE my_table ALTER COLUMN cjsj TYPE character varying; ``` 请注意,这样做可能会影响你的数据存储方式和查询效率,所以在进行更改之前请确认你的需求和风险。 ### 回答2: 这个错误是由于在某个表达式中,column "cjsj" 的数据类型是 timestamp without time zone,然而表达式的类型却是 character varying 引起的。 解决这个问题,我们需要将表达式的数据类型转换为 timestamp without time zone。 可以通过在表达式中使用 cast() 函数来实现类型转换。例如,将表达式转换为 timestamp without time zone,可以使用下面的语法: cast(expression as timestamp without time zone) 这样,将表达式转换为与 column "cjsj" 的数据类型相匹配的类型。 另外,还需要确保表达式的数据格式与 timestamp without time zone 一致。如果表达式的格式不正确,转换将失败。 总之,在解决这个错误之前,需要确认表达式的数据类型和格式,并将其转换为与 column "cjsj" 相匹配的 timestamp without time zone 数据类型。 ### 回答3: 这个错误消息出现是因为你正在尝试将字符串类型的表达式应用于"timestamp without time zone"类型的列"cjsj"上。这是因为数据库系统发现你正在将类型不匹配的数据值插入到"cjsj"列中。 解决这个问题的方法有两种: 1. 将字符串类型的表达式转换为timestamp类型。可以使用数据库系统提供的日期和时间函数将字符串转换为timestamp类型,以便与"cjsj"列的数据类型匹配。 2. 修改表结构,将"cjsj"列的数据类型更改为"character varying"。这样,就能匹配到你想要插入的字符串类型的表达式。 选择哪种方法取决于你的具体需求和数据逻辑。如果你的意图是将一个字符串类型的日期和时间值转换为timestamp类型,并将其插入到"cjsj"列中,那么第一种方法是合适的。如果你确实想将字符串类型的表达式直接存储在"cjsj"列中,那么第二种方法是适用的。 无论你选择哪种方法,记得在修改或添加数据之前,先备份数据库,以避免意外损失。另外,确保在应用更改之前,进行适当的测试,以确保一切正常运行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值