在Oracle中获取前一天的日期

时间:2015-04-16 20:20:01

标签: oracle date truncate

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

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

感谢您的帮助

2 个答案:

答案 0 :(得分:1)

假设您的列属于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 );

答案 1 :(得分:1)

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

OP正在询问昨天的日期。以下sql显示今天属于" BETWEEN TRUNC(SYSDATE) - 1和TRUNC(SYSDATE)"

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

16-Apr-15 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);