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

发布于 2024-11-08 07:15:40 字数 269 浏览 8 评论 0原文

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

如果今天的时间小于该时间,例如今天的时间是下午 1:00。那么我的查询应该将今天的时间设为下午 1:00(这应该返回我的记录)。

如果今天的时间超过下午 3:00,我需要获取昨天下午 3:00 到今天下午 3:00 之间的时间 如果今天的时间小于 3:00 PM,则获取昨天下午 3:00 到今天的当前时间

I have an sql query in which I need to select the records from table where the time is between 3:00 PM yesterday to 3:00 PM today if today's time is more than 3:00 PM.

If today's time is less than that, like if today's time is 1:00 PM. then then my query should take today's time as 1:00 PM (which should return me records).

I need to get the time between 3:00pm yesterday to 3:00pm today if todays time is more than 3:00pm
if todays time is less than 3:00pm then get the 3:00pm yesterday to current time today

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

爱*していゐ 2024-11-15 07:15:40

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

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 小时。

参考:

The best way of handling this is to use an 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;

Conditional WHERE clauses are non-sargable.

Previously:

If I understand correctly, you want to get records within the last day. If the current time is 3 PM or later, the time should be set to 3 PM. If earlier than 3 PM, take the current time...

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

Note:

dt - 1 means that 24 hours will be subtracted from the Oracle DATE.

Reference:

一萌ing 2024-11-15 07:15:40

不需要 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 点之前,我的查询将返回 5 月 17 日和 5 月 18 日的记录,但不会返回 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>

There is no need for an IF statement. This can be solved easily with simple SQL.

My table T23 has some records with dates; here is a sample with times at 3.00pm:

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>

As the current time is before 3.00pm my query will return records from 17-MAY and 18-MAY but not the record where 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>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文