繁体   English   中英

在 Oracle SQL 中比较日期

[英]Comparing Dates in Oracle SQL

我试图让它显示 1994 年 6 月 20 日之后雇用的员工人数,

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

但我得到一个错误说

“JUN”无效标识符。

请帮忙,谢谢!

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

但是,您没有进行字符串比较; 你正在做一个日期比较 您应该将字符串转换为日期。 通过使用内置TO_DATE()函数或日期文字

迄今为止()

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

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

  • 正如评论中指出的 a_horse_with_no_name , DEC不一定意味着 12 月。 这取决于您的NLS_DATE_LANGUAGENLS_DATE_FORMAT设置。 为确保您的比较适用于任何语言环境,您可以改用日期时间格式模型MM
  • 95 年是不准确的。 你知道你的意思是 1995 年,但如果是 50 年,那是 1950 年还是 2050 年? 最好是明确的
select employee_id
  from employee
 where employee_date_hired > to_date('31-12-1995','DD-MM-YYYY')

日期文字

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

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

请记住,Oracle 日期数据类型包含一个时间元素,因此没有时间部分的日期相当于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_LANGUAGE并且NLS_DATE_FORMAT派生自NLS_TERRITORY 这些是在您最初创建数据库时设置的,但可以通过更改初始化参数文件(仅在确实需要时)或在会话级别使用ALTER SESSION语法来更改它们。 例如:

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

这表示:

  • DD数字日期,1 - 31
  • MM一年中的数字月份,01 - 12(一月是 01)
  • YYYY 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的计数。

结论,

to_char以自己的方式工作

所以,

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

您可以按如下方式使用 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;

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM