Условный запрос на основе текущей даты и времени

#sql #oracle #date-arithmetic

#sql #Oracle #дата-арифметика

Вопрос:

У меня есть SQL-запрос, в котором мне нужно выбрать записи из таблицы, где время находится между 15:00 вчера и 15: 00 сегодня, если сегодняшнее время больше 15:00.

Если сегодняшнее время меньше этого, например, если сегодняшнее время равно 13:00 вечера. тогда мой запрос должен принимать сегодняшнее время как 1: 00 вечера (что должно вернуть мне записи).

Мне нужно получить время с 15:00 вчерашнего дня до 15: 00 сегодняшнего дня, если сегодняшнее время больше 15: 00, если сегодняшнее время меньше 15: 00, затем получить 15: 00 вчерашнего дня до текущего времени сегодня

Комментарии:

1. Содержит ли таблица поле CreateDate?

2. привет, мне нужно получить время между 15: 00 вчера и 15: 00 сегодня, если сегодняшнее время больше 15: 00, если сегодняшнее время меньше 15: 00, тогда получите 15: 00 вчера по текущее время сегодня

3. Каким образом публикация одного и того же блока текста в вашем вопросе в качестве комментария к вашему вопросу и в качестве комментария к первому ответу каким-либо образом проясняет ситуацию? Вы читали часто задаваемые вопросы по stackoverflow?

4. получил ответ любым способом извините , если мой вопрос сбивает с толку : (

Ответ №1:

Лучший способ справиться с этим — использовать оператор 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 будут вычтены 24 часа.

Ссылка:

Комментарии:

1. привет, мне нужно получить время между 15: 00 вчера и 15: 00 сегодня, если сегодняшнее время больше 15: 00, если сегодняшнее время меньше 15: 00, тогда получите 15: 00 вчера до текущего времени сегодня, спасибо за ответ

2. Вам не нужны условные обозначения, просто получите все записи до 15:00 сегодня, независимо от того, сколько сейчас времени. В базе данных не будет записей из будущего 🙂

3. Огромное спасибо OMG Ponies и Владиславу Зорову

4. @Vladislav Zorov: Что, если система (или таблица) позволяет вставлять даты только из будущего? Вы выдвигаете предположения…

Ответ №2:

Нет необходимости в инструкции IF. Это можно легко решить с помощью простого SQL.

В моей таблице T23 есть несколько записей с датами; вот пример со временем в 15.00:

 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>
  

Поскольку текущее время до 15.00, мой запрос вернет записи от 17 мая и 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>