31-DEC-95 不是字符串,20-JUN-94 也不是。它们是最后添加了一些额外内容的数字。这应该是 '31-DEC-95' 或 '20-JUN-94' - 请注意单引号 '。这将使您能够进行字符串比较。
但是,您没有进行字符串比较; 您正在进行日期比较。您应该将字符串转换为日期。通过使用内置的TO_DATE() 函数或date literal。
TO_DATE()
select employee_id
from employee
where employee_date_hired > to_date('31-DEC-95','DD-MON-YY')
这个方法有一些不必要的陷阱
select employee_id
from employee
where employee_date_hired > to_date('31-12-1995','DD-MM-YYYY')
日期文字
日期文字是 ANSI 标准的一部分,这意味着您不必使用 Oracle 特定的函数。使用文字时,必须以 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 派生自 NLS_LANGUAGE,NLS_DATE_FORMAT 派生自 NLS_TERRITORY。这些是在您最初创建数据库时设置的,但可以通过更改初始化参数文件(仅在确实需要时)或在会话级别使用ALTER SESSION 语法来更改它们。例如:
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
您可以通过查询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
这会给你计数 per employee_id。