sql报错:文字与格式字符串不匹配+“xxx”标识符无效

本文详细记录了一位开发者在使用Oracle数据库通过DBeaver进行日志表查询时遇到的问题。查询涉及到将日期转换为指定格式,并在WHERE子句中使用别名。最初由于别名在WHERE子句中无法被识别,导致查询失败。通过学习和理解SQL执行顺序,开发者采用了内联视图(子查询)的方法,使得别名在WHERE子句之前被解析,从而成功解决问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


执行环境

oracle+dbeaver


对日志表查询

指定namestartTimeendTime,返回包括id等所有字段信息,指定所有date类型信息以yyyy-MM-dd格式返回。
表中name是varchar类型,两个时间是date类型。
一开始写的:

select id,NAME,
TO_CHAR(STARTTIME , 'yyyy-MM-dd') AS STARTIME,
TO_CHAR(ENDTIME , 'yyyy-MM-dd') AS ENDTIME,
from LOG 
where NAME='xxx' AND STARTTIME='2022-10-01' AND ENDTIME='2022-10-01' 
order by id ASC 

报错说:文字与格式字符串不匹配,可是明明把STARTTIME转换了格式,怎么会不匹配,然后多次尝试把我的变量用各种转换格式的方法处理都不对。看了很多转换格式的例子,发现最开始的变量格式应该是和TO_CHAR之后的字段格式就是匹配的,最后尝试把取的别名换了个名字后发现错误就变了。

新的报错说:新取的别名标识符无效,把where子句里的STARTTIME换成TO_CHAR(STARTTIME , ‘yyyy-MM-dd’) 就没有报错了。

我以为是取别名失败了,但是对比有无“as xxx”后发现,列的名字在加了as后会改,所以其实取成功了。

开始看对列取别名用在where子句的问题,看到这篇文章,说的很清楚了,就是where子句会先执行,取名的子句后执行,所以执行where子句的时候系统不知道你还给字段取了个小名,自然也就不知道你这个没见过的小名是什么了。

解决方法是内联视图,我理解的就是用括号给取名的子句插队,让它比where子句执行的还早就行了。根据大佬的例子,我改写了我的sql语句:

select * 
FROM
(SELECT id,NAME,
TO_CHAR(STARTTIME , 'yyyy-MM-dd') AS STARTIME,
TO_CHAR(ENDTIME , 'yyyy-MM-dd') AS ENDTIME,
from LOG )
where NAME='xxx' AND STARTTIME='2022-10-01' AND ENDTIME='2022-10-01' 
order by id ASC 

最后就岁月静好了【玫瑰花】。


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值