Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Сравнение СУБД [игнор отключен] [закрыт для гостей] / Как ваша любимая БД сравнивает DATE и DATETIME ? / 25 сообщений из 44, страница 1 из 2
21.02.2011, 12:38
    #37127955
iv_an_ru
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ваша любимая БД сравнивает DATE и DATETIME ?
Уважаемые знатоки!

Задача простая как мычание:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
create table tdate (id integer not null primary key, val date);
create index tdateix1 on tdate (val);

insert into tdate values ( 0 , {d '1997/12/31'});
insert into tdate values ( 1 , {d '1998/01/01'});
insert into tdate values ( 2 , {d '1998/01/02'});
insert into tdate values ( 3 , {d '1998/01/03'});
insert into tdate values ( 4 , {d '1998/01/04'});
insert into tdate values ( 5 , {d '1998/01/05'});

Какое значение вернёт
Код: plaintext
1.
select count(*) from tdate where val >= {ts '1998-01-04 12:00:00.0000'};
на вашей любимой БД? Вариантов два: или константа будет приведена к типу колонки для поиска по индексу, получится '1998-01-04 ровно', и тогда ответ будет 2, или сравнение будет сделано как если бы сравнивался int и float: приведение к более общему типу (т.е. значений из колонки к DATETIME) и затем "разумное" сравнение, которое даст ответ 1, но хотелось бы знать их популярности.

И второй вопрос: а сколько вернёт
Код: plaintext
1.
select count(*) from tdate where val < {ts '1998-01-04 12:00:00.0000'};
...
Рейтинг: 0 / 0
21.02.2011, 13:00
    #37128024
Зайцев Фёдор
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ваша любимая БД сравнивает DATE и DATETIME ?
Ответ простой, как мычание
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Msg 241, Level 16, State 3, Line 4
Ошибка преобразования даты или времени из символьной строки.
Msg 241, Level 16, State 3, Line 5
Ошибка преобразования даты или времени из символьной строки.
Msg 241, Level 16, State 3, Line 6
Ошибка преобразования даты или времени из символьной строки.
Msg 241, Level 16, State 3, Line 7
Ошибка преобразования даты или времени из символьной строки.
Msg 241, Level 16, State 3, Line 8
Ошибка преобразования даты или времени из символьной строки.
Msg 241, Level 16, State 3, Line 9
Ошибка преобразования даты или времени из символьной строки.
...
Рейтинг: 0 / 0
21.02.2011, 13:04
    #37128038
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ваша любимая БД сравнивает DATE и DATETIME ?
Firebird: ответы 1 и 4.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
21.02.2011, 14:55
    #37128420
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ваша любимая БД сравнивает DATE и DATETIME ?
ЗайцевФедорОтвет простой, как мычание
а что за СУБД так мычит? MSSQL?
...
Рейтинг: 0 / 0
21.02.2011, 15:00
    #37128444
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ваша любимая БД сравнивает DATE и DATETIME ?
Dimitry SibiryakovFirebird: ответы 1 и 4.

В завтрашних снапшотах уже должны быть правильные 1 и 5.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
21.02.2011, 15:09
    #37128475
kDnZP
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ваша любимая БД сравнивает DATE и DATETIME ?
kdvЗайцевФедорОтвет простой, как мычание
а что за СУБД так мычит? MSSQL?


MSSQL:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
create table #tdate (id integer not null primary key, val DATETIME);
create index #tdateix1 on #tdate (val);

insert into #tdate values ( 0 ,  '19971231');
insert into #tdate values ( 1 ,  '19980101');
insert into #tdate values ( 2 ,  '19980102');
insert into #tdate values ( 3 ,  '19980103');
insert into #tdate values ( 4 ,  '19980104');
insert into #tdate values ( 5 ,  '19980105');

select count(*) from #tdate where val >= '1998-01-04 12:00:00.000'
select count(*) from #tdate where val <  '1998-01-04 12:00:00.000'
PRINT 'А терь по нормальному, не завязыаясь на локаль:'
select count(*) from #tdate where val >= '19980104 12:00:00.000'
select count(*) from #tdate where val <  '19980104 12:00:00.000'

DROP TABLE #tdate

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
-----------
0
-----------
6

А терь по нормальному, не завязыаясь на локаль:

-----------
1
-----------
5
...
Рейтинг: 0 / 0
21.02.2011, 15:18
    #37128502
kDnZP
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ваша любимая БД сравнивает DATE и DATETIME ?
* можно еще так:

Код: plaintext
1.
select count(*) from #tdate where val >= '1998-01-04T12:00:00.000'
select count(*) from #tdate where val <  '1998-01-04T12:00:00.000'
Результат тот же: 1, 5
...
Рейтинг: 0 / 0
21.02.2011, 15:19
    #37128507
Le Peace
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ваша любимая БД сравнивает DATE и DATETIME ?
kDnZP,

вопрос был про date, а у вас в таблице datetime
...
Рейтинг: 0 / 0
21.02.2011, 15:22
    #37128516
Le Peace
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ваша любимая БД сравнивает DATE и DATETIME ?
iv_an_ru,

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
create table #tdate (id integer not null primary key, val DATE);
create index #tdateix1 on #tdate (val);

insert into #tdate values ( 0 ,  '19971231');
insert into #tdate values ( 1 ,  '19980101');
insert into #tdate values ( 2 ,  '19980102');
insert into #tdate values ( 3 ,  '19980103');
insert into #tdate values ( 4 ,  '19980104');
insert into #tdate values ( 5 ,  '19980105');

select count(*) from #tdate where val >= '19980104 12:00:00.000'
select count(*) from #tdate where val <  '19980104 12:00:00.000'

DROP TABLE #tdate
2

4
...
Рейтинг: 0 / 0
21.02.2011, 15:26
    #37128528
kDnZP
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ваша любимая БД сравнивает DATE и DATETIME ?
Le Peace, у меня под рукой только Microsoft SQL Server 2005 и 2000... Там такого типа нет. Пусть кто-то другой потестит.
...
Рейтинг: 0 / 0
21.02.2011, 15:32
    #37128545
daw
daw
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ваша любимая БД сравнивает DATE и DATETIME ?
> 2
>
> 4

не-не-не!

Код: plaintext
1.
2.
select count(*) from #tdate where val >= cast('19980104 12:00:00.000' as datetime)
select count(*) from #tdate where val <  cast('19980104 12:00:00.000' as datetime)

просто '19980104 12:00:00.000' - это varchar. и приоритет у него гораздо ниже, чем у date.
а вот у datetime - выше.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
21.02.2011, 15:34
    #37128553
Зайцев Фёдор
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ваша любимая БД сравнивает DATE и DATETIME ?
а что делает
автор
Код: plaintext
{ts '1998-01-04 12:00:00.0000'}

?

если учесть название темы, то

Код: plaintext
1.
2.
3.
4.
5.
6.
declare @date datetime = '19980104 12:00:00.000';
declare @tdate table (id integer not null primary key, val date null);

insert into @tdate values ( 0 ,  '19971231'), ( 1 ,  '19980101'), ( 2 ,  '19980102'), ( 3 ,  '19980103'), ( 4 ,  '19980104'), ( 5 ,  '19980105');

select count(*) from @tdate where val >= @date
select count(*) from @tdate where val <  @date
1
5
...
Рейтинг: 0 / 0
21.02.2011, 15:38
    #37128570
Le Peace
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ваша любимая БД сравнивает DATE и DATETIME ?
daw, спасибо.

интересно, а почему индекс используется, если столбец date конвертируется в datetime?
...
Рейтинг: 0 / 0
21.02.2011, 15:51
    #37128609
iv_an_ru
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ваша любимая БД сравнивает DATE и DATETIME ?
Зайцев Фёдора что делает
автор
Код: plaintext
{ts '1998-01-04 12:00:00.0000'}

Это "якобы стандартный" синтаксис в ODBC, который якобы должны понимать или драйверы, или request broker-ы или компиляторы SQL-запросов, которые должны заменять его на cast (константа AS имя подходящего типа). На самом же деле, драйвер часто надеется, что этим займётся БД, а БД вовсе не хочет прогибаться под какие-то посторонние спеки. Саботаж усиливает то, что там есть и неудобные для реализации вещи, вроде {fn имя_якобы_стандартной_функции (аргументы)}, и никому не хочется делать лишнюю работу, в результате которой пользователям будет удобнее переходить на конкурирующие платформы :)
...
Рейтинг: 0 / 0
21.02.2011, 16:28
    #37128707
daw
daw
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ваша любимая БД сравнивает DATE и DATETIME ?
> интересно, а почему индекс используется, если столбец date конвертируется в datetime?

хм. да. занятно. насколько я понимаю из плана, на самом деле столбец в
datetime не конвертируется. и вообще ничего никуда не конвертируется.
по крайней мере, в плане конвертаций не видно.
если условие просто на равенство сделать:

Код: plaintext
1.
2.
3.
declare @d date--time
set @d = '19980104 12:00:00.000'
select count(*) from #tdate where val = @d

то планы для @d - date и datetime вообще одинаковые получаются.
в случае с неравенством несколько разные - когда тип столбца и переменной
различаются, вызывается некое GetRangeWithMismatchedTypes.
но конвертаций я не вижу.
вот если varchar сделать, сразу увидим CONVERT_IMPLICIT.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
21.02.2011, 16:38
    #37128733
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ваша любимая БД сравнивает DATE и DATETIME ?
On 21.02.2011 12:38, iv_an_ru wrote:

Sybase ASE 12.5

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
create table tdate (id integer not null primary key, val date)
go
create index tdateix1 on tdate(val)
go

insert into tdate values ( 0 , '1997/12/31')
insert into tdate values ( 1 , '1998/01/01')
insert into tdate values ( 2 , '1998/01/02')
insert into tdate values ( 3 , '1998/01/03')
insert into tdate values ( 4 , '1998/01/04')
insert into tdate values ( 5 , '1998/01/05')

go

select count(*) from tdate where val >= '1998-01-04 12:00:00.000'
go


[fix]
------------
2
[/fix]
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
21.02.2011, 16:40
    #37128742
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ваша любимая БД сравнивает DATE и DATETIME ?
On 21.02.2011 16:38, MasterZiv wrote:

Код: plaintext
1.
2.
select count(*) from tdate where val < '1998-01-04 12:00:00.000'
go

[fix]
------------
4
[/fix]

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
21.02.2011, 16:40
    #37128743
ОКТОГЕН
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ваша любимая БД сравнивает DATE и DATETIME ?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
create table tdate (id integer not null primary key, val date);
create index tdateix1 on tdate (val);

insert into tdate values ( 0 ,  '1997/12/31');
insert into tdate values ( 1 ,  '1998/01/01');
insert into tdate values ( 2 ,  '1998/01/02');
insert into tdate values ( 3 ,  '1998/01/03');
insert into tdate values ( 4 ,  '1998/01/04');
insert into tdate values ( 5 ,  '1998/01/05');



select count(*) from tdate where val >= '1998-01-04 12:00:00.0000';--2
select count(*) from tdate where val <  '19980104 12:00:00.000';--4

...
Рейтинг: 0 / 0
21.02.2011, 16:43
    #37128755
Le Peace
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ваша любимая БД сравнивает DATE и DATETIME ?
MasterZiv,

выше уже сказали, что нужно сравнивать не со строкой, а с явным datetime.
...
Рейтинг: 0 / 0
21.02.2011, 16:45
    #37128761
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ваша любимая БД сравнивает DATE и DATETIME ?
On 21.02.2011 15:32, daw wrote:

> просто '19980104 12:00:00.000' - это varchar. и приоритет у него гораздо ниже,
> чем у date.
> а вот у datetime - выше.

Приоритеты тут ни при чём. Просто нету констант типа datetime, вместо них --
строковые. Но они контекстно всегда преобразуются в datetime.

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
21.02.2011, 16:48
    #37128769
Le Peace
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ваша любимая БД сравнивает DATE и DATETIME ?
MasterZivOn 21.02.2011 15:32, daw wrote:

> просто '19980104 12:00:00.000' - это varchar. и приоритет у него гораздо ниже,
> чем у date.
> а вот у datetime - выше.

Приоритеты тут ни при чём. Просто нету констант типа datetime, вместо них --
строковые. Но они контекстно всегда преобразуются в datetime.


Да в том-то и дело, что нет.
Если вы преобразуете в datetime явно, то получите другой результат (в случае MS SQL).
То есть строка преобразуется в date, а не в datetime.
...
Рейтинг: 0 / 0
21.02.2011, 16:52
    #37128786
daw
daw
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ваша любимая БД сравнивает DATE и DATETIME ?
> Приоритеты тут ни при чём. Просто нету констант типа datetime, вместо них --
> строковые. Но они контекстно всегда преобразуются в datetime.

приоритеты при всем. и не всегда в datetime.
с чего бы к datetime преобразовывать, если с другой стороны выражения - date.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
21.02.2011, 17:00
    #37128810
daw
daw
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ваша любимая БД сравнивает DATE и DATETIME ?
> приоритеты при всем. и не всегда в datetime.
> с чего бы к datetime преобразовывать, если с другой стороны выражения - date.

да - это я про ms sql, конечно (начиная с 2000-ого sp4, по крайней мере). как в sybase не знаю.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
21.02.2011, 17:03
    #37128814
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ваша любимая БД сравнивает DATE и DATETIME ?
dawс чего бы к datetime преобразовывать, если с другой стороны выражения - date.

Тебя не смущает, что в сабже прописано сравнение DATE именно с DATETIME, а не с DATE или
со строкой?..
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
21.02.2011, 17:08
    #37128823
Зайцев Фёдор
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ваша любимая БД сравнивает DATE и DATETIME ?
Dimitry Sibiryakovdawс чего бы к datetime преобразовывать, если с другой стороны выражения - date.

Тебя не смущает, что в сабже прописано сравнение DATE именно с DATETIME, а не с DATE или
со строкой?..

а должно? )
...
Рейтинг: 0 / 0
Форумы / Сравнение СУБД [игнор отключен] [закрыт для гостей] / Как ваша любимая БД сравнивает DATE и DATETIME ? / 25 сообщений из 44, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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