比较Oracle SQL中的日期

时间:2012-04-16 16:50:52

标签: sql oracle

我试图让它显示1994年6月20日之后雇用的员工人数, 但是我收到一条错误,说“JUN”标识符无效。请帮助,谢谢!

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

5 个答案:

答案 0 :(得分:262)

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

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

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设置。为确保您与任何区域设置中的工作进行比较,您可以使用datetime format model 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。这些是在您最初创建数据库时设置的,但可以通过更改您的inialization参数文件(仅在确实需要时)或在会话级别使用ALTER SESSION语法来更改它们。例如:

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

这意味着:

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

这会为您提供 per employee_id的计数。

答案 1 :(得分:4)

结论,

to_char以自己的方式运作

所以,

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

答案 2 :(得分:4)

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

答案 3 :(得分:2)

来自您的查询:

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;

答案 4 :(得分:-4)

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

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