首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >选择早于时间范围SQL的日期

选择早于时间范围SQL的日期
EN

Stack Overflow用户
提问于 2018-06-20 23:52:32
回答 2查看 68关注 0票数 0

我试图在数据库中查找录取日期早于特定时间范围的所有记录(在这种情况下,所有录取日期都早于4天)。

我有:

代码语言:javascript
复制
     select memberid, admitdate
     from membertable
     where admitdate < (sysdate-4)

结果,我得到了很多与此匹配的录取日期,但我也获得了仅2天前的日期,所以这与我的代码不匹配。我做错了什么?

如果有帮助,录取日期的格式为mm/dd/yyyy。

EN

回答 2

Stack Overflow用户

发布于 2018-06-21 23:49:29

日期,包括sysdate,都有一个时间部分。即使您所有的sysdate值都是午夜,这仍然是一个时间,如果您在午夜运行查询,admitdate将只在午夜运行。

代码语言:javascript
复制
select sysdate, sysdate-4, trunc(sysdate), trunc(sysdate)-4 from dual;

SYSDATE             SYSDATE-4           TRUNC(SYSDATE)      TRUNC(SYSDATE)-4   
------------------- ------------------- ------------------- -------------------
2018-06-21 16:44:53 2018-06-17 16:44:53 2018-06-21 00:00:00 2018-06-17 00:00:00

如果您在sysdate-4上过滤记录,那么它将包括所有admitdate值,在本例中为2018-06-17 16:44:53;因此,假设17号的所有记录实际上都是午夜。

代码语言:javascript
复制
with membertable (memberid, admitdate) as (
            select 1, date '2018-06-15' from dual
  union all select 2, date '2018-06-16' from dual
  union all select 3, date '2018-06-17' from dual
  union all select 4, date '2018-06-18' from dual
  union all select 5, date '2018-06-19' from dual
  union all select 6, date '2018-06-20' from dual
  union all select 7, date '2018-06-21' from dual
)
select memberid, admitdate
from membertable
where admitdate < (sysdate-4);

  MEMBERID ADMITDATE          
---------- -------------------
         1 2018-06-15 00:00:00
         2 2018-06-16 00:00:00
         3 2018-06-17 00:00:00

如果您截断要比较的值,则其时间部分也将被视为午夜,因此您将仅匹配该时间点之前的记录,2018-06-17 00:00:00: 00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00

代码语言:javascript
复制
with membertable (memberid, admitdate) as (
            select 1, date '2018-06-15' from dual
  union all select 2, date '2018-06-16' from dual
  union all select 3, date '2018-06-17' from dual
  union all select 4, date '2018-06-18' from dual
  union all select 5, date '2018-06-19' from dual
  union all select 6, date '2018-06-20' from dual
  union all select 7, date '2018-06-21' from dual
)
select memberid, admitdate
from membertable
where admitdate < trunc(sysdate)-4;

  MEMBERID ADMITDATE          
---------- -------------------
         1 2018-06-15 00:00:00
         2 2018-06-16 00:00:00
票数 1
EN

Stack Overflow用户

发布于 2018-06-20 23:54:06

admitdate应为date。您似乎在暗示它是一个字符串。您可以尝试:

代码语言:javascript
复制
where to_date(admitdate, 'MM/DD/YYYY') < trunc(sysdate) - 4;

然后,您可以修改表中的数据,以便将其存储为日期。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50952360

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档