基于当前日期的条件查询;时间

时间:2011-05-18 06:20:45

标签: sql oracle date-arithmetic

我有一个sql查询,我需要从表中选择时间在昨天下午3:00到今天下午3:00之间的记录如果今天的时间超过3:00 PM。

如果今天的时间少于那个时间,就像今天的时间是下午1点。然后我的查询应该采取今天的下午1:00(这应该返回我的记录)。

如果今天的时间超过下午3点,我需要在昨天下午3点到今天下午3点之间抽出时间 如果今天的时间不到下午3点,那么昨天下午3点到今天的当前时间

2 个答案:

答案 0 :(得分:2)

处理此问题的最佳方法是使用IF statement

IF TO_CHAR(SYSDATE, 'HH24') >= 15 THEN 

  SELECT x.*
    FROM YOUR_TABLE x
   WHERE x.date_column BETWEEN TO_DATE(TO_CHAR(SYSDATE -1, 'YYYY-MM-DD')|| ' 15:00:00', 'YYYY-MM-DD HH24:MI:SS')
                           AND TO_DATE(TO_CHAR(SYSDATE, 'YYYY-MM-DD')|| ' 15:00:00', 'YYYY-MM-DD HH24:MI:SS')

ELSE

  SELECT x.*
    FROM YOUR_TABLE x
   WHERE x.date_column BETWEEN TO_DATE(TO_CHAR(SYSDATE -1, 'YYYY-MM-DD')|| ' 15:00:00', 'YYYY-MM-DD HH24:MI:SS')
                           AND SYSDATE

END IF;

条件WHERE子句是不可搜索的。

此前:

如果我理解正确,您希望在最后一天内获得记录。如果当前时间是下午3点或更晚,则时间应设置为下午3点。如果早于下午3点,请按当前时间......

SELECT x.*
  FROM YOUR_TABLE x
  JOIN (SELECT CASE
                 WHEN TO_CHAR(SYSDATE, 'HH24') >= 15 THEN 
                  TO_DATE(TO_CHAR(SYSDATE, 'YYYY-MM-DD')|| ' 15:00:00', 'YYYY-MM-DD HH24:MI:SS')
                 ELSE SYSDATE
               END AS dt
          FROM DUAL) y ON x.date_column BETWEEN dt - 1 AND dt

注意:

dt - 1表示将从Oracle DATE中减去24小时。

参考:

答案 1 :(得分:1)

不需要IF声明。这可以通过简单的SQL轻松解决。

我的桌子T23有一些日期记录;这是一个样本,时间是下午3点:

SQL> select id, some_date from t23
  2  where to_char(some_date,'HH24') = '15'
  3  /

        ID SOME_DATE
---------- ---------
        14 16-MAY-11
        38 17-MAY-11
        62 18-MAY-11
        81 19-MAY-11

SQL>

由于当前时间是在下午3点之前,我的查询将返回17-MAY和18-MAY的记录,但不记录ID = 62的记录......

SQL> select to_char(sysdate, 'DD-MON-YYYY HH24:MI') as time_now
  2  from dual
  3  /

TIME_NOW
-----------------
18-MAY-2011 10:45

SQL> select id, to_char(some_date, 'DD-MON-YYYY HH24:MI') as dt
  2  from t23
  3  where some_date between trunc(sysdate-1)+(15/24)
  4                  and least( trunc(sysdate)+(15/24), sysdate)
  5  /

        ID DT
---------- -----------------
        38 17-MAY-2011 15:00
        39 17-MAY-2011 16:00
        40 17-MAY-2011 17:00
        41 17-MAY-2011 18:00
        42 17-MAY-2011 19:00
        43 17-MAY-2011 20:00
        44 17-MAY-2011 21:00
        45 17-MAY-2011 22:00
        46 17-MAY-2011 23:00
        47 18-MAY-2011 00:00
        48 18-MAY-2011 01:00
        49 18-MAY-2011 02:00
        50 18-MAY-2011 03:00
        51 18-MAY-2011 04:00
        52 18-MAY-2011 05:00
        53 18-MAY-2011 06:00
        54 18-MAY-2011 07:00
        55 18-MAY-2011 08:00
        56 18-MAY-2011 09:00
        57 18-MAY-2011 10:00

20 rows selected.

SQL>