Является ли дата в Oracle-SQL без значения времени всегда 00:00:00? - PullRequest
2 голосов
/ 26 июля 2010

Heyho,

Мне нужно получить некоторые данные из действий, которые были выполнены с даты A 00:00:00 и даты B 00:00:00 (в данном случае Дата A: 16.07.2010 Дата B: 20.07.2010) поэтому я написал это предложение-выборку:

Select avg(cnt),fext from (
        Select 
            to_char(mytable.dateadded, 'DD.MM.YYYY') dateadded,
            fext, 
            count(id) cnt 
        from mytable 
        where dateadded between
            to_date('16.07.2010', 'dd,MM,YYYY') and 
            to_date('20.07.2010', 'dd,MM,YYYY')
        group by 
            to_char(mytable.dateadded, 'DD.MM.YYYY'),
            fext)
group by fext;

Исходное (и рабочее) утверждение имело:

    to_date('16.07.2010 00:00:00', 'dd,MM,YYYY HH24:Mi:SS') and 
    to_date('20.07.2010 00:00:00', 'dd,MM,YYYY HH24:Mi:SS')

, поэтому вопрос: действительно ли

    to_date('16.07.2010', 'dd,MM,YYYY') and 
    to_date('20.07.2010', 'dd,MM,YYYY')

уже установил время для даты A и B на 00: 00: 00?

Greetz

Ответы [ 5 ]

7 голосов
/ 26 июля 2010

Если вы не укажете временную часть даты, это будет 00: 00: 00.

Если вы беспокоитесь о временной части, вы всегда можете обрезать временную часть:

Trunc(to_date('16.07.2010', 'dd.MM.YYYY')) and 
Trunc(to_date('20.07.2010', 'dd.MM.YYYY'))
4 голосов
/ 26 июля 2010

Самый простой способ - использовать литералы даты ANSI, которые не позволяют указывать время и, следовательно, имеют внутреннюю часть времени 00:00:00:

dateadded between date '2010-07-16' and date '2010-07-20'

Ваши выражения выглядят странно,ваша строка даты содержит точки в качестве разделителя компонента времени, а формат даты содержит запятые.Oracle принимает это, хотя:

rwijk@XE> select to_date('16.07.2010', 'dd,MM,YYYY') from dual;

TO_DATE('16.07.2010
-------------------
16-07-2010 00:00:00

1 row selected.

Я бы использовал литерал даты ANSI для простоты.

С уважением, Роб.

2 голосов
/ 27 июля 2010

Это единственное, что согласуется с SQL - если вы не предоставите часть времени для типа данных DATE, который включает часть времени (IE Oracle, PostgreSQL, а MySQL и SQL Server явно называют его DATETIME), тогдавременная часть по умолчанию точно соответствует полуночи этой даты - 00:00:00.И если это полночь, это означает начало даты - если вы хотите включить всю дату в сравнение дат, временной интервал значения должен быть 23:49:49 - от секунды до полуночи.

2 голосов
/ 26 июля 2010

этот запрос вернет вам одну строку, которая отвечает на ваш вопрос, я думаю:

SELECT TO_DATE('16.07.2010 00:00:00', 'dd,MM,YYYY HH24:Mi:SS'),  
       TO_DATE('16.07.2010', 'dd,MM,YYYY')
  FROM dual
 WHERE to_date('16.07.2010 00:00:00', 'dd,MM,YYYY HH24:Mi:SS') = to_date('16.07.2010', 'dd,MM,YYYY')  
0 голосов
/ 18 июня 2015

23: 59: 59 - вторая до полуночи.По сути, полночь определяется как начало дня: 00:00:00.Затем секундные часы до конца дня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...