为了账号安全,请及时绑定邮箱和手机立即绑定

请问Oracle SQL中日期的比较

/ 猿问

请问Oracle SQL中日期的比较

跃然一笑 2019-10-12 13:07:53

Oracle SQL中日期的比较

我试图让它显示1994年6月20日以后雇用的员工人数,但是我发现一个错误,上面写着“Jun”无效标识符。请帮助,谢谢!

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


查看完整描述

3 回答

?
皈依舞

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')

这种方法有一些不必要的缺陷。

  • 作为注释中指出的带有_no_name的_mart_,

    DEC

    并不一定意味着12月。这取决于你的

    NLS_DATE_LANGUAGE

    NLS_DATE_FORMAT

    设置。若要确保与任何区域设置中的工作进行比较,可以使用

    日期时间格式模型 MM

    相反
  • ‘95年是不准确的。你知道你指的是1995年,但如果是’50年,那是1950年还是2050年?最好是直截了当。
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_LANGUAGENLS_DATE_FORMAT派生自NLS_TERRITORY..这些设置是在您最初创建数据库时设置的,但是可以通过更改您的inialization参数文件(仅在真正需要的情况下)或在会话级别上使用ALTER SESSION语法。例如:

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

这意味着:

  • DD

    月数值日,1-31
  • MM

    数字月份,01-12(1月为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

这给了你数 employee_id.



查看完整回答
反对 回复 2019-10-13
?
阿波罗的战车

to_char以自己的方式工作

所以,

始终使用此格式YYYYY-MM-DD为了比较而不是mm-DD-YYDD-MM-YYYY或任何其他格式


查看完整回答
反对 回复 2019-10-13
?
米脂

从您的查询中:

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');orto_char(employee_date_hired, 'YYYMMMDDD') > 19940620;



查看完整回答
反对 回复 2019-10-13

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信