【问题标题】:Get date of the previous day in Oracle在Oracle中获取前一天的日期
【发布时间】:2015-04-16 20:20:00
【问题描述】:

我需要在 Oracle 中使用截断而不是如何截断日期的前一天。他正在使用以下行,但给我带来了当天执行的一些记录,不应该这样做。 Neceisto 仅在前一天;调查发现在 Oracle 中有日期截断,但没有发现如何使用它。

and fnxs.FECHA_INGRESO BETWEEN (TO_CHAR (SYSDATE-1, 'DD-MON-YY')) AND (TO_CHAR (SYSDATE, 'DD-MON-YY'));

感谢您的帮助

【问题讨论】:

  • 你真的想要昨天的记录吗?您接受了一个可以返回今天记录的答案。
  • 不要将日期存储在varchar 列中。你应该尽快解决这个问题。

标签: oracle date truncate


【解决方案1】:

在 Oracle 中使用带有日期的 BETWEEN 通常是个坏主意。我一直都看到它,而且大多数时候人们都弄错了(就像上面接受的答案一样)。即使他们完全理解包含两个日期,他们仍然会犯逻辑错误,因为他们忘记了时间戳。

OP 要求提供昨天的日期。下面的sql显示今天在“BETWEEN TRUNC(SYSDATE) - 1 AND TRUNC(SYSDATE)”内

with adate as (
    select trunc(sysdate) today from dual
) select today from adate where today between trunc(sysdate) -1 
and trunc(sysdate);

15 年 4 月 16 日 00:00:00 [返回今天的记录]

我发现当您对终点更明确时,更容易正确使用日期:

SELECT * from your_table
WHERE fnxs.FECHA_INGRESO >= TRUMC(SYSDATE) - 1
AND fnxs.FECHA_INGRESO < TRUNC(SYSDATE);

仔细观察,OP 的类似日期的列可能是一个 VARCHAR2(可能仍然是他给出的比较中隐含的日期)。如果是VARCHAR,则需要先转换(使用适当的格式字符串):

SELECT * FROM your_table
WHERE TO_DATE(fnxs.FECHA_INGRESO, 'DD-MON-YY') >= TRUMC(SYSDATE) - 1
AND TO_DATE(fnxs.FECHA_INGRESO, 'DD-MON-YY') < TRUNC(SYSDATE);

【讨论】:

  • "在日期中使用 BETWEEN 通常是个坏主意" - 对于 真正的 日期则不然。不幸的是,Oracle 的 date 实际上是 timestamp(或 datetime),它没有“真实”日期(即日期和只有日期,而不是时间部分)。
  • 好的,我会更好地限定我的陈述。
  • @a_horse_with_no_name:即使没有时间戳,其他答案也是错误的。我想我应该说很多人不明白BETWEEN 包含端点。
【解决方案2】:

假设您的列的类型为DATE

SELECT *
FROM   TABLE_NAME
WHERE  FECHA_INGRESO BETWEEN TRUNC( SYSDATE ) - 1
                         AND TRUNC( SYSDATE );

如果是字符串则:

SELECT *
FROM   TABLE_NAME
WHERE  TO_DATE( FECHA_INGRESO, 'DD-MON-YY' )
          BETWEEN TRUNC( SYSDATE ) - 1
              AND TRUNC( SYSDATE );

【讨论】:

  • 您的解决方案包括今天的记录
猜你喜欢
  • 1970-01-01
  • 2012-12-11
  • 2019-04-10
  • 1970-01-01
  • 2010-12-14
  • 1970-01-01
  • 2015-09-27
  • 2011-04-14
  • 1970-01-01
相关资源
最近更新 更多