我有一列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')
这也不返回任何内容。我究竟做错了什么?谢谢!
答案 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提供了完美的解决方案,但我认为我们可以添加更多说明。
每使用两位数的年份,以下是rr
和yy
的行为:
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
干杯!