【问题标题】:Oracle SQL/PL - ORA-01843: not a valid monthOracle SQL/PL - ORA-01843: 不是一个有效的月份
【发布时间】:2022-01-22 06:05:15
【问题描述】:

我收到错误消息:ORA-01843: not a valid month after execution a sql plus script.
我尝试使用“标准”日期格式 yyyy-mm-dd。
SQL/PL 不理解 alter session 语句吗?

set linesize 200
set pagesize 1000
alter session set NLS_NUMERIC_CHARACTERS = ',.';
alter session set NLS_DATE_FORMAT = 'yyyy-mm-dd';

select
 *
from my_table
where  
date >= '2019-08-31';

exit

【问题讨论】:

  • 您的“日期”列的数据类型是什么? (“日期”是一个保留字,所以我严重怀疑它是列的实际名称)。请更新您的问题以提供minimal reproducible example
  • 你用的是什么接口? SQL开发者?蟾蜍? PLSQL 开发者?其中一些使用自己的 NLS 参数并且不尊重您的ALTER SESSION。在任何情况下,正确的解决方案是在右侧的字符串之前添加关键字date,将其从文本文字转换为日期文字。日期文字需要'yyyy-mm-dd' 格式(没有其他格式可用于日期文字),并且不依赖于NLS_DATE_FORMAT

标签: oracle date


【解决方案1】:

在我看来,您需要做的不是将日期值与字符串进行比较。

假设 date 这里实际上代表一个 DATE 数据类型列(你为什么不发布表描述?)(正如已经评论过的,你不能这样命名一个列,除非你把它的名字包含在双引号),然后

where date >= '2019-08-31'
      ----    ------------
      DATE     this is a string
    datatype

使用日期字面量,它总是有一个DATE 关键字和'yyyy-mm-dd' 格式的日期:

where date >= date '2019-08-31'

或者,使用带有适当格式掩码的to_date 函数:

where date >= to_date('2019-08-31', 'yyyy-mm-dd')

如果date 列(错误的名称,我们已经知道)实际上包含字符串,而您希望所有字符串都遵循'yyyy-mm-dd' 格式,那么有些值不会。将日期存储到 varchar2 数据类型列几乎总是一个坏主意。没有人阻止您存储例如'2019-ac-31' 插入其中,这不是有效的日期值。

【讨论】:

    猜你喜欢
    • 2016-11-07
    • 2012-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-04
    • 2012-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多