比较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_LANGUAGE
和NLS_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_LANGUAGE
, NLS_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-YY或DD-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';