Answers:
31-DEC-95
不是字符串,也不是20-JUN-94
。它们是数字,最后添加了一些其他内容。这应该是'31-DEC-95'
或'20-JUN-94'
-注意单引号,'
。这将使您能够进行字符串比较。
但是,您没有在进行字符串比较;您正在进行日期比较。您应该将字符串转换为日期。通过使用内置TO_DATE()
函数或日期文字。
select employee_id
from employee
where employee_date_hired > to_date('31-DEC-95','DD-MON-YY')
这种方法有一些不必要的陷阱
DEC
,不一定表示12月。这取决于您NLS_DATE_LANGUAGE
和的NLS_DATE_FORMAT
设置。为了确保在任何语言环境中工作的比较,你可以使用日期时间格式模型 MM
代替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-31MM
年份的数字月份,01-12(一月为01)YYYY
4位数字年份-在我看来,这总是比2位数字年份更好,YY
因为您所指的世纪没有混淆。HH24
一天中的0到23点MI
每小时的分钟数,0-59SS
分钟,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
这给你计数每 employee_id
。
DEC
不一定总是有效的月份。通常最好使用数字代替名称
timestamp
文字而不是date
文字:(timestamp '2015-01-30 19:42:04'
因为在ANSI SQL中,date
数据类型没有时间,只有timestamp
数据类型才有时间)。
DATE 2016-04-01
手段2016-04-01 00:00:00
。而且我认为此语法自Oracle 9i起就可以使用,因为这是将ANSI-SQL语法引入Oracle的地方。
您可以如下使用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
我认为,最佳做法是可以比较日期:
employee_date_hired > TO_DATE('20-06-1994', 'DD-MM-YYYY');
or
to_char(employee_date_hired, 'YYYMMMDDD') > 19940620;
由于日期已转换为字符,因此必须在其中添加单引号。
选择employee_id,计数(*) 来自员工 其中to_char(employee_date_hired,'DD-MON-YY')> '31 -DEC-95';
> <
BETWEEN '' AND ''