比较 Oracle SQL 中的日期

2024-01-16

我试图让它显示 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' or '20-JUN-94'- 注意单引号,'。这将使您能够进行字符串比较。

但是,您不是在进行字符串比较;而是在进行字符串比较。你正在进行日期比较。您应该将字符串转换为日期。通过使用内置的TO_DATE() http://docs.oracle.com/database/121/SQLRF/functions219.htm#SQLRF06132函数,或日期文字 http://docs.oracle.com/cd/E11882_01/server.112/e26088/sql_elements003.htm#SQLRF51062.

迄今为止()

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

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

  • 正如 a_horse_with_no_name 在评论中指出的那样,DEC,并不一定意味着十二月。这取决于你的NLS_DATE_LANGUAGE http://docs.oracle.com/cd/E11882_01/server.112/e10729/ch3globenv.htm#i1006894 and NLS_DATE_FORMAT http://docs.oracle.com/cd/E11882_01/server.112/e10729/ch3globenv.htm#i1006817设置。为了确保您的比较适用于任何区域设置,您可以使用日期时间格式模型 http://docs.oracle.com/database/121/SQLRF/sql_elements004.htm#SQLRF00212 MM instead
  • 95 年是不准确的。你知道你指的是 1995 年,但如果是 50 年呢,是 1950 年还是 2050 年呢?明确总是最好的
select employee_id
  from employee
 where employee_date_hired > to_date('31-12-1995','DD-MM-YYYY')

日期文字

日期文字是 ANSI 标准的一部分,这意味着您不必使用 Oracle 特定的函数。当你使用文字时must以格式指定您的日期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 http://docs.oracle.com/cd/E11882_01/server.112/e10729/ch3globenv.htm#i1006894源自NLS_LANGUAGE http://docs.oracle.com/cd/E11882_01/server.112/e10729/ch3globenv.htm#i1006480 and NLS_DATE_FORMAT http://docs.oracle.com/cd/E11882_01/server.112/e10729/ch3globenv.htm#i1006817源自NLS_TERRITORY http://docs.oracle.com/cd/E11882_01/server.112/e10729/ch3globenv.htm#i1006575。这些是在您最初创建数据库时设置的,但可以通过更改初始化参数文件来更改它们 - 仅当确实需要时 - 或在会话级别使用ALTER SESSION http://docs.oracle.com/database/121/SQLRF/statements_2015.htm#SQLRF00901句法。例如:

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

这意味着:

  • DD月份中的数字日期,1 - 31
  • MM一年中的数字月份,01 - 12(一月是 01 )
  • YYYY4 位数字年份 - 我认为这是always比 2 位数年份更好YY因为与您所指的世纪没有任何混淆。
  • HH24一天中的某个小时,0 - 23
  • MI一小时中的分钟,0 - 59
  • SS分钟的秒数,0-59

您可以通过查询找到您当前的语言和日期语言设置V$NLS_PARAMETERSs以及通过查询获得所有有效值V$NLS_VALID_VALUES.

进一步阅读

  • 格式化模型 http://docs.oracle.com/database/121/SQLRF/sql_elements004.htm#SQLRF00212

顺便说一句,如果您想要count(*)你需要分组依据employee_id

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

这给你计数per employee_id.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

比较 Oracle SQL 中的日期 的相关文章

随机推荐