如何在PLSQL中选择日期?

时间:2019-09-27 15:41:25

标签: sql oracle date

我有一列DATA_TYPE = DATE。当我查询表时,该列中的数据示例为

28-APR-08

所以我试图像这样查询它:

select * from mytable where mydatecolumn = '28-APR-08'

这不返回任何内容。我也尝试过:

select * from mytable where mydatecolumn = TO_DATE('2008/04/28', 'yyyy/mm/dd')

这也不返回任何内容。我究竟做错了什么?谢谢!

3 个答案:

答案 0 :(得分:2)

由于您的区域设置(Google NLS_DATE_FORMAT了解更多信息),您看到的值为“ 28-APR-08”。默认情况下,仅显示日期,不显示时间部分。检查以下示例:

CREATE TABLE just_a_date(mydate DATE);
Table JUST_A_DATE created.
INSERT INTO just_a_date(mydate) VALUES (SYSDATE);
1 row inserted.
SELECT * FROM just_a_date;
27-SEP-2019
SELECT * FROM just_a_date WHERE mydate = '27-SEP-19';
no rows selected

这就是您所看到的。 Oracle DATE数据类型存储DATE和TIME直到第二个。让我们通过使用格式掩码来仔细查看表just_a_date中的数据。

SELECT TO_CHAR(mydate, 'DD-MON-YYYY HH24:MI:SS')  FROM just_a_date;
27-SEP-2019 14:50:51

你去了。它有一个时间部分。如果您查询mydate = '27-SEP-19',则Oracle会将其隐式转换为27-SEP-2019 00:00:00,并且您将不会获得任何行。如果您指定时间部分直到第二秒,您将获得这些行。

SELECT * FROM just_a_date WHERE mydate = TO_DATE('27-SEP-2019 14:50:51','DD-MON-YYYY HH24:MI:SS');
27-SEP-2019

或者...如果您不关心时间部分,可以使用TRUNC函数。这将从DATE列中删除时间部分。

SELECT * FROM just_a_date WHERE TRUNC(mydate)  = TO_DATE('27-SEP-2019','DD-MON-YYYY');
27-SEP-2019

答案 1 :(得分:0)

  

RR日期时间格式元素类似于YY日期时间格式   元素,但它为存储日期提供了额外的灵活性   其他世纪的价值。 RR日期时间格式元素可让您   通过仅指定20世纪日期来存储21世纪的20世纪日期   年份的后两位数字。

因此,使用'DD-MON-RR'作为案例的日期格式:

select * from mytable where mydatecolumn = to_date('28-APR-08','DD-MON-RR')

答案 2 :(得分:0)

Barbaros提供了完美的解决方案,但我认为我们可以添加更多说明。

每使用两位数的年份,以下是rryy的行为:

  • rr

50-99被解释为1950-1999,即上个世纪的日期, 和以00-49结尾的日期解释为2000-2049,即当前世纪日期

  • 是:

在yy的情况下,没有这种区分,它存储2000到2099的00-99,即仅当前世纪日期

几个例子:

To_date('20-07-89', 'dd-mm-yy') --> 20 july, 2089
To_date('20-07-89', 'dd-mm-rr') --> 20 july, 1989

To_date('20-07-19', 'dd-mm-yy') --> 20 july, 2019
To_date('20-07-19', 'dd-mm-rr') --> 20 july, 2019

干杯!