【问题标题】:What is the difference between these 2 sql queries?这2个sql查询有什么区别?
【发布时间】:2020-03-22 17:15:41
【问题描述】:
select * from accounts where sysdate - 100 < last_active_dt;

select * from accounts where sysdate - 100 <= last_active_dt;

两个查询都返回了相同的结果。

我在想,对于第一个查询,它不会选择 last_active_dt的记录。对于第二个查询,它 选择last_active_dt当天的记录。

但这似乎并非如此,因为两者都返回了相同的结果。

有什么不同吗?我怎样才能看到差异?

last_active_dt column follows a date format DD-MON-YYYY

【问题讨论】:

  • 你的accounts表中有sysdate - 100 == last_active_dt的数据吗?

标签: sql oracle jpa oracle-sqldeveloper


【解决方案1】:

last_active_dt 列遵循日期格式DD-MON-YYYY

不,不是(但在您使用的用户界面中可能看起来像)。

DATE 数据类型始终具有年、月、日、小时、分钟和秒组件,并存储在(无任何格式)7 bytes 中。它是对日期应用(默认)格式的用户界面,这可能会对您隐藏时间组件。

你可以使用:

ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';

更改 SQL*Plus(和 SQL Developer)中使用的默认日期格式以查看所有组件的日期。

同样,SYSDATE 属于 DATE 数据类型,具有年、月、日、小时、分钟和秒组成部分,因此您可能想要的是:

select * from accounts where TRUNC( sysdate ) - INTERVAL '100' DAY < last_active_dt;

这将获取 100 天前(即使是 1 秒后)last_active_dt 位于当天午夜之后的所有列。如果您的所有last_active_dt 值的时间都为TRUNC 精确到午夜00:00:00 但如果列是非零时间组件则不会,因为您仍将获得时间从00:00:0123:59:59 的值100 天前的那一天。

如果您的 last_active_dt 具有非零时间组件,那么您需要:

select * from accounts where TRUNC( sysdate ) - INTERVAL '99' DAY <= last_active_dt;

【讨论】:

  • 随着时间的推移,现在这一切都与我现在正在做的事情有关。非常感谢!
猜你喜欢
  • 2023-03-19
  • 2012-04-19
  • 1970-01-01
  • 2014-02-08
  • 1970-01-01
  • 2010-12-19
  • 2012-08-05
  • 1970-01-01
相关资源
最近更新 更多