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 )
-
YYYY
4 位数字年份 - 我认为这是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
.