Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / to_date без даты и сравнение по времени / 10 сообщений из 10, страница 1 из 1
06.10.2017, 12:36
    #39532103
Kido
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
to_date без даты и сравнение по времени
В таблице 2 поля с типом date в которых хранится время: start_time, end_time

Нужно получать строки, у которых промежуток между start_time и end_time соответсвтует sysdate
Приложение по умолчанию садит дату 01.01.1980. Расчитывать, что она всегда будет такой я не могу (кто знает, что там поменяется).
Моё первое решение выглядит следующим образом:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
with t as (
  select to_date('01.01.1980 09:00:00','dd.mm.yyyy hh24:mi:ss') as start_time, to_date('01.01.1980 15:00:00','dd.mm.yyyy hh24:mi:ss') as end_time from dual union all 
  select to_date('01.01.1980 15:00:00','dd.mm.yyyy hh24:mi:ss') as start_time, to_date('01.01.1980 21:00:00','dd.mm.yyyy hh24:mi:ss') as end_time from dual union all 
  select to_date('01.01.1980 12:00:00','dd.mm.yyyy hh24:mi:ss') as start_time, to_date('01.01.1980 22:00:00','dd.mm.yyyy hh24:mi:ss') as end_time from dual union all 
  select to_date('01.01.1980 18:00:00','dd.mm.yyyy hh24:mi:ss') as start_time, to_date('01.01.1980 23:00:00','dd.mm.yyyy hh24:mi:ss') as end_time from dual  
)
  select * from t 
  where 
    to_char(sysdate,'hh24:mi:ss')
      between 
        to_char(start_time, 'hh24:mi:ss')
        and 
        to_char(end_time, 'hh24:mi:ss') ;



Но ведь это сравнение строк, а не дат. Мне почему то показалось, что это не верно и потому второй вариант выглядит уже вот так
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
with t as (
  select to_date('01.01.1980 09:00:00','dd.mm.yyyy hh24:mi:ss') as start_time, to_date('01.01.1980 15:00:00','dd.mm.yyyy hh24:mi:ss') as end_time from dual union all 
  select to_date('01.01.1980 15:00:00','dd.mm.yyyy hh24:mi:ss') as start_time, to_date('01.01.1980 21:00:00','dd.mm.yyyy hh24:mi:ss') as end_time from dual union all 
  select to_date('01.01.1980 12:00:00','dd.mm.yyyy hh24:mi:ss') as start_time, to_date('01.01.1980 22:00:00','dd.mm.yyyy hh24:mi:ss') as end_time from dual union all 
  select to_date('01.01.1980 18:00:00','dd.mm.yyyy hh24:mi:ss') as start_time, to_date('01.01.1980 23:00:00','dd.mm.yyyy hh24:mi:ss') as end_time from dual  
)
  select * from t 
  where 
    to_date(to_char(sysdate,'hh24:mi:ss'),'hh24:mi:ss') 
      between 
        to_date(to_char(start_time, 'hh24:mi:ss'),'hh24:mi:ss') 
        and 
        to_date(to_char(end_time, 'hh24:mi:ss'),'hh24:mi:ss') ;
        



И отсюда вытекает второй вопрос - почему оракл когда делаешь
Код: plsql
1.
2.
3.
4.
5.
SQL> select to_date('10:00:00','hh24:mi:ss') from dual; 

TO_DATE('10:00:00','HH24:MI:SS')
--------------------------------
01.10.2017 10:00:00 

выбирает дату равную 1 числа, текущего месяца. Можно ли на это пологаться. В доке ответа не нашел. Ткните если кто найдет пож-та.

Ну это уже побочный вопрос :)

Господа, хотелось бы услышать ваше мнение. Какой из подходов более адекватен или как бы вы решили эту задачу.
Спасибо
...
Рейтинг: 0 / 0
06.10.2017, 12:47
    #39532116
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
to_date без даты и сравнение по времени
Kido,

в чем проблема со сравнением строк?
я б убрал разделители

https://docs.oracle.com/cd/B28359_01/server.111/b28286/sql_elements003.htm#SQLRF51049
авторIf you specify a date value without a date, then the default date is the first day of the current month.


.....
stax
...
Рейтинг: 0 / 0
06.10.2017, 12:50
    #39532118
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
to_date без даты и сравнение по времени
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
with t as (
  select to_date('01.01.1980 09:00:00','dd.mm.yyyy hh24:mi:ss') as start_time, to_date('01.01.1980 15:00:00','dd.mm.yyyy hh24:mi:ss') as end_time from dual union all
  select to_date('01.01.1980 15:00:00','dd.mm.yyyy hh24:mi:ss') as start_time, to_date('01.01.1980 21:00:00','dd.mm.yyyy hh24:mi:ss') as end_time from dual union all
  select to_date('01.01.1980 12:00:00','dd.mm.yyyy hh24:mi:ss') as start_time, to_date('01.01.1980 22:00:00','dd.mm.yyyy hh24:mi:ss') as end_time from dual union all
  select to_date('01.01.1980 18:00:00','dd.mm.yyyy hh24:mi:ss') as start_time, to_date('01.01.1980 23:00:00','dd.mm.yyyy hh24:mi:ss') as end_time from dual
)
  select sysdate, t.*
  from t
  where numtodsinterval(sysdate - trunc(sysdate), 'day') between
                    numtodsinterval(start_time - trunc(start_time), 'day')
                and numtodsinterval(end_time   - trunc(end_time  ), 'day');

SYSDATE             START_TIME          END_TIME
------------------- ------------------- -------------------
2017-10-06 12:50:14 1980-01-01 09:00:00 1980-01-01 15:00:00
2017-10-06 12:50:14 1980-01-01 12:00:00 1980-01-01 22:00:00
...
Рейтинг: 0 / 0
06.10.2017, 12:52
    #39532120
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
to_date без даты и сравнение по времени
AmKad,

Код: plsql
1.
where sysdate - trunc(sysdate) between start_time - trunc(start_time) and end_time - trunc(end_time)
...
Рейтинг: 0 / 0
06.10.2017, 13:29
    #39532168
Kido
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
to_date без даты и сравнение по времени
AmKad, Stax

Больше спасибо!
...
Рейтинг: 0 / 0
06.10.2017, 15:20
    #39532318
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
to_date без даты и сравнение по времени
KidoРасчитывать, что она всегда будет такой я не могу (кто знает, что там поменяется ).


подляна будет если старт и енд будут не в один день
напр через полночь (третья смена)


.....
stax
...
Рейтинг: 0 / 0
06.10.2017, 16:18
    #39532364
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
to_date без даты и сравнение по времени
KidoПриложение по умолчанию садит дату 01.01.1980
Kidoили как бы вы решили эту задачу.

Содрать с автора приложения неустойку за косячную дату и потребовать доработки под адекватные данные.
...
Рейтинг: 0 / 0
06.10.2017, 16:32
    #39532375
Fogel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
to_date без даты и сравнение по времени
StaxKidoРасчитывать, что она всегда будет такой я не могу (кто знает, что там поменяется ).


подляна будет если старт и енд будут не в один день
напр через полночь (третья смена)


.....
stax
Код: plsql
1.
2.
3.
4.
5.
6.
7.
with t as (
  select to_date('01.01.1980 09:00:00','dd.mm.yyyy hh24:mi:ss') as start_time, to_date('01.01.1980 15:00:00','dd.mm.yyyy hh24:mi:ss') as end_time from dual union all
  select to_date('01.01.1980 15:00:00','dd.mm.yyyy hh24:mi:ss') as start_time, to_date('01.01.1980 21:00:00','dd.mm.yyyy hh24:mi:ss') as end_time from dual union all
  select to_date('01.01.1980 12:00:00','dd.mm.yyyy hh24:mi:ss') as start_time, to_date('01.01.1980 22:00:00','dd.mm.yyyy hh24:mi:ss') as end_time from dual union all
  select to_date('01.01.1980 18:00:00','dd.mm.yyyy hh24:mi:ss') as start_time, to_date('01.01.1980 23:00:00','dd.mm.yyyy hh24:mi:ss') as end_time from dual
)
 select sysdate, t.* from t where to_date(to_char(t.start_time,'dd.mm.yyyy')||' '||to_char(sysdate,'hh24:mi:ss'), 'dd.mm.yyyy hh24:mi:ss') between t.start_time and t.end_time
...
Рейтинг: 0 / 0
06.10.2017, 16:56
    #39532388
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
to_date без даты и сравнение по времени
Fogel,
от постановщиков зависит как и что считать
Код: plsql
1.
2.
3.
4.
5.
6.
7.
with t as (
  select to_date('06.09.2017 23:00:00','dd.mm.yyyy hh24:mi:ss') as start_time, to_date('07.09.2017 07:00:00','dd.mm.yyyy hh24:mi:ss') as end_time from dual 
)
 select sysdat, t.* from t ,
 (select to_date('06.10.2017 01:00:00','dd.mm.yyyy hh24:mi:ss') sysdat from dual) --sysdate
where to_date(to_char(t.start_time,'dd.mm.yyyy')||' '||to_char(sysdat,'hh24:mi:ss'), 'dd.mm.yyyy hh24:mi:ss') between t.start_time and t.end_time
/


......
stax
...
Рейтинг: 0 / 0
09.10.2017, 06:05
    #39533143
Kido
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
to_date без даты и сравнение по времени
env,

Автор приложения сам сдирает с нас немалые деньги. В обратную сторону этот механизм не работает :)
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / to_date без даты и сравнение по времени / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]