比较Oracle SQL中的date

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

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

31-DEC-95不是一个string,也不是20-JUN-94 。 他们是最后添加了一些额外的东西的数字。 这应该是“ '31-DEC-95'或“ '20-JUN-94' – 注意单引号。 这将使您能够进行string比较。

但是,你并没有进行string比较。 你正在做一个date比较 。 你应该把你的string转换成date。 通过使用内置的TO_DATE()函数或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设置。 为了确保您在任何语言环境中的工作比较,您可以使用date时间格式模型 MM
  • 95年是不准确的。 你知道你的意思是1995年,但如果是50年,是1950年还是2050年呢? 总是最好的是明确的
 select employee_id from employee where employee_date_hired > to_date('31-12-1995','DD-MM-YYYY') 

date文字

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

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

请记住,Oracledate数据types包含时间要素,所以没有时间部分的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' 

更多信息

NLS_DATE_LANGUAGE源自NLS_LANGUAGENLS_DATE_FORMAT源自NLS_TERRITORY 。 这些是在最初创build数据库时设置的,但是可以通过更改初始化参数文件(仅在真正需要时)或在会话级别使用ALTER SESSION语法来ALTER SESSION 。 例如:

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

意即:

  • 本月的DD数字日,1 – 31
  • 一月的MM数字月份,01 – 12(一月是01)
  • YYYY 4位数年份 – 在我看来这比YY因为不会和你指的是什么世纪混淆。
  • HH24小时,0 – 23日
  • MI分钟,0 – 59
  • SS第二分钟,0-59

您可以通过查询V$NLS_PARAMETERSs和查询V$NLS_VALID_VALUES来获得有效值的全部范围,从而找出当前的语言和date语言设置。

进一步阅读

  • 格式模型

顺便说一下,如果你想要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 

我认为最好的做法来比较date,你可以使用:

 employee_date_hired > TO_DATE('20-06-1994', 'DD-MM-YYYY'); or to_char(employee_date_hired, 'YYYMMMDDD') > 19940620; 

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

selectemployee_id,计数(*)
从员工
 where to_char(employee_date_hired,'DD-MON-YY')> '31 -DEC-95';