【问题标题】:TO_CHAR is failing in SQL queryTO_CHAR 在 SQL 查询中失败
【发布时间】:2022-01-20 07:41:51
【问题描述】:

为什么在我执行这个脚本时TO_CHAR(rln.FECHA_CONSULTA,'dd-MM-yyyy')AS'FECHA_CONSULTA' 会失败?

SELECT 
rln.CIF_NIF,
rln.MOTIVO,
TO_CHAR(rln.FECHA_CONSULTA,'dd-MM-yyyy') AS 'FECHA_CONSULTA' --fail here
FROM RASTRO_LISTA_NEGRA rln 
WHERE rln.FECHA_CONSULTA >= TO_DATE (CONCAT(TO_CHAR(sysdate-1,'dd/MM/yyyy'),'08:00:00'), 'DD/MM/YYYY HH24:MI:SS')

我正在使用甲骨文

【问题讨论】:

  • “失败”是什么意思?请编辑您的问题以显示您得到的完整错误。但是 - AS 'FECHA_CONSULTA' 应该是 AS "FECHA_CONSULTA" 或只是 AS FECHA_CONSULTA。单引号用于字符串文字,双引号用于标识符。
  • 您尝试过使用 CAST 或 CONVERT 吗?
  • @Synapsis 为什么?在 Oracle 中,CONVERT 将字符串从一个字符集更改为另一个字符集,CAST 更改数据类型,它们都不会将日期格式化为 OP 的格式。

标签: sql oracle


【解决方案1】:

单引号用于字符串文字。不适用于别名。

所以改变这个

AS 'FECHA_CONSULTA' --fail here

到这里

AS "FECHA_CONSULTA" --alright

或者这个

AS FECHA_CONSULTA   --okidoki

另外,WHERE 子句可以简化

WHERE rln.FECHA_CONSULTA >= (TRUNC(SYSDATE-1) + INTERVAL '08:00' HOUR TO MINUTE) 

【讨论】:

  • 注意AS FECHA_CONSULTA 是可以的,但如果它包含空格,则需要用引号括起来,如`AS "FECHA CONSULTA"。此外,当不在引号中时,它总是显示为大写,不是吗?
【解决方案2】:

这基本上是一个错字:单引号用于literal values,双引号用于标识符。

From the documentation:

...您用带引号的标识符或不带引号的标识符表示对象的名称。

  • 带引号的标识符以双引号 (") 开头和结尾。如果使用带引号的标识符命名架构对象,则在引用该对象时必须使用双引号。
  • 不带引号的标识符没有被任何标点符号包围。

所以AS 'FECHA_CONSULTA' 应该是AS "FECHA_CONSULTA",或者只是AS FECHA_CONSULTA,因为在这种情况下不需要引用别名标识符。

但你也可以简化:

TO_DATE (CONCAT(TO_CHAR(sysdate-1,'dd/MM/yyyy'),'08:00:00'), 'DD/MM/YYYY HH24:MI:SS')

到:

TRUNC(sysdate-1) + INTERVAL '8' HOUR

TRUNC(sysdate-1) + (8/24)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-05
    • 2012-05-20
    • 2019-06-18
    • 1970-01-01
    • 2010-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多