在 Oracle SQL 中比较日期

Comparing Dates in Oracle SQL(在 Oracle SQL 中比较日期)
本文介绍了在 Oracle SQL 中比较日期的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I'm trying to get it to display the number of employees that are hired after June 20, 1994,

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' - 注意单引号 '.这将使您能够进行字符串比较.

31-DEC-95 isn't a string, nor is 20-JUN-94. They're numbers with some extra stuff added on the end. This should be '31-DEC-95' or '20-JUN-94' - note the single quote, '. This will enable you to do a string comparison.

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

However, you're not doing a string comparison; you're doing a date comparison. You should transform your string into a date. Either by using the built-in TO_DATE() function, or a date literal.

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

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

This method has a few unnecessary pitfalls

  • 正如评论中提到的 a_horse_with_no_name,DEC 并不一定意味着 12 月.这取决于您的 NLS_DATE_LANGUAGENLS_DATE_FORMAT 设置.为确保与任何语言环境中的工作进行比较,您可以使用 日期时间格式模型 MM 而不是
  • 95 年不准确.你知道你的意思是 1995 年,但如果是 50 年,那是 1950 年还是 2050 年?最好是明确的
  • As a_horse_with_no_name noted in the comments, DEC, doesn't necessarily mean December. It depends on your NLS_DATE_LANGUAGE and NLS_DATE_FORMAT settings. To ensure that your comparison with work in any locale you can use the datetime format model MM instead
  • The year '95 is inexact. You know you mean 1995, but what if it was '50, is that 1950 or 2050? It's always best to be explicit
select employee_id
  from employee
 where employee_date_hired > to_date('31-12-1995','DD-MM-YYYY')

日期文字

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

Date literals

A date literal is part of the ANSI standard, which means you don't have to use an Oracle specific function. When using a literal you must specify your date in the format YYYY-MM-DD and you cannot include a time element.

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

请记住,Oracle 日期数据类型包含时间元素,因此没有时间部分的日期相当于 1995-12-31 00:00:00.

Remember that the Oracle date datatype includes a time elemement, so the date without a time portion is equivalent to 1995-12-31 00:00:00.

如果要包含时间部分,则必须使用时间戳文字,其格式为 YYYY-MM-DD HH24:MI:SS[.FF0-9]

If you want to include a time portion then you'd have to use a timestamp literal, which takes the format 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 语法.例如:

Further information

NLS_DATE_LANGUAGE is derived from NLS_LANGUAGE and NLS_DATE_FORMAT is derived from NLS_TERRITORY. These are set when you initially created the database but they can be altered by changing your inialization parameters file - only if really required - or at the session level by using the ALTER SESSION syntax. For instance:

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
  • DD numeric day of the month, 1 - 31
  • MM numeric month of the year, 01 - 12 ( January is 01 )
  • YYYY 4 digit year - in my opinion this is always better than a 2 digit year YY as there is no confusion with what century you're referring to.
  • HH24 hour of the day, 0 - 23
  • MI minute of the hour, 0 - 59
  • SS second of the minute, 0-59

您可以通过查询 V$NLS_PARAMETERSs 找到您当前的语言和日期语言设置,并通过查询 V$NLS_VALID_VALUES 找到有效值的全部范围.

You can find out your current language and date language settings by querying V$NLS_PARAMETERSs and the full gamut of valid values by querying V$NLS_VALID_VALUES.

  • 格式化模型

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

Incidentally, if you want the count(*) you need to group by employee_id

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

这将为您提供 per employee_id 的计数.

This gives you the count per employee_id.

这篇关于在 Oracle SQL 中比较日期的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

Execute complex raw SQL query in EF6(在EF6中执行复杂的原始SQL查询)
Hibernate reactive No Vert.x context active in aws rds(AWS RDS中的休眠反应性非Vert.x上下文处于活动状态)
Bulk insert with mysql2 and NodeJs throws 500(使用mysql2和NodeJS的大容量插入抛出500)
Flask + PyMySQL giving error no attribute #39;settimeout#39;(FlASK+PyMySQL给出错误,没有属性#39;setTimeout#39;)
auto_increment column for a group of rows?(一组行的AUTO_INCREMENT列?)
Sort by ID DESC(按ID代码排序)