比较Oracle SQL中的日期

use*_*830 128 sql oracle

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

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

Ben*_*Ben 276

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')
Run Code Online (Sandbox Code Playgroud)

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

  • 正如评论中注明的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')
Run Code Online (Sandbox Code Playgroud)

日期文字

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

select employee_id
  from employee
 where employee_date_hired > date '1995-12-31'
Run Code Online (Sandbox Code Playgroud)

请记住,Oracle date数据类型包含时间元素,因此没有时间部分的日期相当于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'
Run Code Online (Sandbox Code Playgroud)

更多的信息

NLS_DATE_LANGUAGE源自NLS_LANGUAGENLS_DATE_FORMAT源自NLS_TERRITORY.这些是在您最初创建数据库时设置的,但可以通过更改您的inialization参数文件(仅在确实需要时)或在会话级别使用ALTER SESSION语法来更改它们.例如:

alter session set nls_date_format = 'DD.MM.YYYY HH24:MI:SS';
Run Code Online (Sandbox Code Playgroud)

这意味着:

  • DD 每月的数字日期,1 - 31
  • MM 一年中的数字月份,01 - 12(1月是01)
  • YYYY4位数 - 在我看来,这总是比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
Run Code Online (Sandbox Code Playgroud)

这给你计算每个 employee_id.

  • 在to_date()中使用格式掩码的+1.请注意,由于语言设置不同,这仍然可能在不同的环境中失败.`DEC`不一定总是有效月份.通常最好使用数字而不是名字 (13认同)
  • 与每次都必须键入 TO_DATE 和 Date-Format 相比,ANSI 日期文字确实是一种简洁的方法。适合像我这样的 ** LAZY** 开发人员。需要注意的一件事是“DATE 2016-04-01”实际上意味着“2016-04-01 00:00:00”。我认为这种语法自 **Oracle 9i** 起就有效,因为这是将 ANSI-SQL 语法引入 Oracle 的地方。 (2认同)

小智 5

结论,

to_char 以自己的方式工作

所以,

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


Gio*_* M. 5

您可以按如下方式使用 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;
Run Code Online (Sandbox Code Playgroud)


vid*_*uka 5

根据您的查询:

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

我认为它不会显示 1994 年 6 月 20 日之后雇用的员工人数。如果你想显示员工人数,你可以使用:

Select count(*) From Employee 
Where to_char(employee_date_hired, 'YYYMMMDDD') > 19940620 
Run Code Online (Sandbox Code Playgroud)

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

employee_date_hired > TO_DATE('20-06-1994', 'DD-MM-YYYY');
or
to_char(employee_date_hired, 'YYYMMMDDD') > 19940620;
Run Code Online (Sandbox Code Playgroud)