在 Oracle SQL 中比较日期

我想让它显示1994年6月20日之后雇佣的员工数量,

Select employee_id, count(*)
From Employee
Where to_char(employee_date_hired, 'DD-MON-YY') > 31-DEC-95;

但是我得到了一个错误的说法

”JUN’无效标识符。

请帮帮忙,谢谢!

811735 次浏览

31-DEC-95不是字符串,20-JUN-94也不是。它们是数字,末尾加了一些额外的东西。这应该是 '31-DEC-95''20-JUN-94'-注意单引号,'。这将使您能够进行字符串比较。

但是,您没有进行字符串比较; 你在做日期比较。您应该将字符串转换为日期。可以使用内置的 TO_DATE()函数,也可以使用 字面上的日期函数。

TO _ DATE ()

select employee_id
from employee
where employee_date_hired > to_date('31-DEC-95','DD-MON-YY')

这种方法有一些不必要的缺陷

  • 正如评论中指出的,DEC并不一定意味着十二月。这取决于你的 NLS_DATE_LANGUAGENLS_DATE_FORMAT设置。为了确保您的比较将在任何地区工作,您可以使用 日期时间格式模型 MM代替
  • 95年是不准确的。你知道你说的是1995年,但如果是1950年,那是1950年还是2050年?最好说得直白一点
select employee_id
from employee
where employee_date_hired > to_date('31-12-1995','DD-MM-YYYY')

日期字面意思

日期文字是 ANSI 标准的一部分,这意味着您不必使用 Oracle 特定的函数。使用文字时,必须的YYYY-MM-DD格式指定日期,不能包含 time 元素。

select employee_id
from employee
where employee_date_hired > date '1995-12-31'

请记住,Oracle 日期数据类型包含一个 time 元素,因此没有时间部分的日期等效于 1995-12-31 00:00:00

如果您想包含一个时间部分,那么您必须使用一个时间戳文字,它采用格式 YYYY-MM-DD HH24:MI:SS[.FF0-9]

select employee_id
from employee
where employee_date_hired > timestamp '1995-12-31 12:31:02'

进一步资料

NLS_DATE_LANGUAGE 来源于 NLS_LANGUAGENLS_DATE_FORMAT来源于 NLS_TERRITORY。它们是在您最初创建数据库时设置的,但是它们可以通过更改初始化参数文件(仅在真正需要时)或在会话级别使用 ALTER SESSION语法进行更改。例如:

alter session set nls_date_format = 'DD.MM.YYYY HH24:MI:SS';

这意味着:

  • DD月份的数字日,1-31
  • MM年的数字月份,01-12(1月是01)
  • 4位数的年份-在我看来,这是 一直都是优于2位数的年份 YY,因为没有混淆你指的是哪个世纪。
  • HH24小时,0-23
  • MI分钟,0-59
  • 每分钟 SS秒,0-59

可以通过查询 V$NLS_PARAMETERSs找到当前的语言和日期语言设置,通过查询 V$NLS_VALID_VALUES找到所有有效值。

进一步阅读


顺便说一下,如果你想要 count(*),你需要按 employee_id分组

select employee_id, count(*)
from employee
where employee_date_hired > date '1995-12-31'
group by employee_id

这给你计数 每年 employee_id

单引号必须在那里,因为日期转换为字符。

Select employee_id, count(*)
From Employee
Where to_char(employee_date_hired, 'DD-MON-YY') > '31-DEC-95';

结论,

to_char以自己的方式工作

那么,

始终使用此格式 YYYY-MM-DD进行比较 而不是 好耶或任何其他格式

您可以使用 trunc 和 to _ date,如下所示:

select TO_CHAR (g.FECHA, 'DD-MM-YYYY HH24:MI:SS') fecha_salida, g.NUMERO_GUIA, g.BOD_ORIGEN, g.TIPO_GUIA, dg.DOC_NUMERO, dg.*
from ils_det_guia dg, ils_guia g
where dg.NUMERO_GUIA = g.NUMERO_GUIA and dg.TIPO_GUIA = g.TIPO_GUIA and dg.BOD_ORIGEN = g.BOD_ORIGEN
and dg.LAB_CODIGO = 56
and trunc(g.FECHA) > to_date('01/02/15','DD/MM/YY')
order by g.FECHA;

从你的问题:

Select employee_id, count(*) From Employee
Where to_char(employee_date_hired, 'DD-MON-YY') > '31-DEC-95'

我认为这不是为了显示1994年6月20日以后雇佣的员工数量。如果你想显示员工人数,你可以使用:

Select count(*) From Employee
Where to_char(employee_date_hired, 'YYYMMMDDD') > 19940620

我认为比较日期的最佳实践可以使用:

employee_date_hired > TO_DATE('20-06-1994', 'DD-MM-YYYY');
or
to_char(employee_date_hired, 'YYYMMMDDD') > 19940620;