Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Сравнение СУБД Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Как ваша любимая БД сравнивает DATE и DATETIME ?  [new]
iv_an_ru
Member

Откуда: Новосибирск
Сообщений: 20368
Уважаемые знатоки!

Задача простая как мычание:
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'});

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

И второй вопрос: а сколько вернёт
select count(*) from tdate where val < {ts '1998-01-04 12:00:00.0000'};
21 фев 11, 12:38    [10266486]     Ответить | Цитировать Сообщить модератору
 Re: Как ваша любимая БД сравнивает DATE и DATETIME ?  [new]
Зайцев Фёдор
Member

Откуда: Лужки
Сообщений: 5308
Ответ простой, как мычание
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
Ошибка преобразования даты или времени из символьной строки.
21 фев 11, 13:00    [10266668]     Ответить | Цитировать Сообщить модератору
 Re: Как ваша любимая БД сравнивает DATE и DATETIME ?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 54803

Firebird: ответы 1 и 4.

Posted via ActualForum NNTP Server 1.4

21 фев 11, 13:04    [10266688]     Ответить | Цитировать Сообщить модератору
 Re: Как ваша любимая БД сравнивает DATE и DATETIME ?  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 30261
ЗайцевФедор
Ответ простой, как мычание

а что за СУБД так мычит? MSSQL?
21 фев 11, 14:55    [10267594]     Ответить | Цитировать Сообщить модератору
 Re: Как ваша любимая БД сравнивает DATE и DATETIME ?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 54803

Dimitry Sibiryakov
Firebird: ответы 1 и 4.

В завтрашних снапшотах уже должны быть правильные 1 и 5.

Posted via ActualForum NNTP Server 1.4

21 фев 11, 15:00    [10267644]     Ответить | Цитировать Сообщить модератору
 Re: Как ваша любимая БД сравнивает DATE и DATETIME ?  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
kdv
ЗайцевФедор
Ответ простой, как мычание

а что за СУБД так мычит? MSSQL?



MSSQL:
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

-----------
0
-----------
6

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

-----------
1
-----------
5
21 фев 11, 15:09    [10267727]     Ответить | Цитировать Сообщить модератору
 Re: Как ваша любимая БД сравнивает DATE и DATETIME ?  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
* можно еще так:

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
21 фев 11, 15:18    [10267797]     Ответить | Цитировать Сообщить модератору
 Re: Как ваша любимая БД сравнивает DATE и DATETIME ?  [new]
Le Peace
Member

Откуда: Москва
Сообщений: 8969
kDnZP,

вопрос был про date, а у вас в таблице datetime
21 фев 11, 15:19    [10267804]     Ответить | Цитировать Сообщить модератору
 Re: Как ваша любимая БД сравнивает DATE и DATETIME ?  [new]
Le Peace
Member

Откуда: Москва
Сообщений: 8969
iv_an_ru,

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
21 фев 11, 15:22    [10267827]     Ответить | Цитировать Сообщить модератору
 Re: Как ваша любимая БД сравнивает DATE и DATETIME ?  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
Le Peace, у меня под рукой только Microsoft SQL Server 2005 и 2000... Там такого типа нет. Пусть кто-то другой потестит.
21 фев 11, 15:26    [10267865]     Ответить | Цитировать Сообщить модератору
 Re: Как ваша любимая БД сравнивает DATE и DATETIME ?  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

> 2
>
> 4

не-не-не!

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

21 фев 11, 15:32    [10267918]     Ответить | Цитировать Сообщить модератору
 Re: Как ваша любимая БД сравнивает DATE и DATETIME ?  [new]
Зайцев Фёдор
Member

Откуда: Лужки
Сообщений: 5308
а что делает
автор
{ts '1998-01-04 12:00:00.0000'}

?

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

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
21 фев 11, 15:34    [10267940]     Ответить | Цитировать Сообщить модератору
 Re: Как ваша любимая БД сравнивает DATE и DATETIME ?  [new]
Le Peace
Member

Откуда: Москва
Сообщений: 8969
daw, спасибо.

интересно, а почему индекс используется, если столбец date конвертируется в datetime?
21 фев 11, 15:38    [10267975]     Ответить | Цитировать Сообщить модератору
 Re: Как ваша любимая БД сравнивает DATE и DATETIME ?  [new]
iv_an_ru
Member

Откуда: Новосибирск
Сообщений: 20368
Зайцев Фёдор
а что делает
автор
{ts '1998-01-04 12:00:00.0000'}

Это "якобы стандартный" синтаксис в ODBC, который якобы должны понимать или драйверы, или request broker-ы или компиляторы SQL-запросов, которые должны заменять его на cast (константа AS имя подходящего типа). На самом же деле, драйвер часто надеется, что этим займётся БД, а БД вовсе не хочет прогибаться под какие-то посторонние спеки. Саботаж усиливает то, что там есть и неудобные для реализации вещи, вроде {fn имя_якобы_стандартной_функции (аргументы)}, и никому не хочется делать лишнюю работу, в результате которой пользователям будет удобнее переходить на конкурирующие платформы :)
21 фев 11, 15:51    [10268098]     Ответить | Цитировать Сообщить модератору
 Re: Как ваша любимая БД сравнивает DATE и DATETIME ?  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

> интересно, а почему индекс используется, если столбец date конвертируется в datetime?

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

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

21 фев 11, 16:28    [10268412]     Ответить | Цитировать Сообщить модератору
 Re: Как ваша любимая БД сравнивает DATE и DATETIME ?  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34709

On 21.02.2011 12:38, iv_an_ru wrote:

Sybase ASE 12.5

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

21 фев 11, 16:38    [10268510]     Ответить | Цитировать Сообщить модератору
 Re: Как ваша любимая БД сравнивает DATE и DATETIME ?  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34709

On 21.02.2011 16:38, MasterZiv wrote:

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

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

Posted via ActualForum NNTP Server 1.4

21 фев 11, 16:40    [10268535]     Ответить | Цитировать Сообщить модератору
 Re: Как ваша любимая БД сравнивает DATE и DATETIME ?  [new]
ОКТОГЕН
Member

Откуда:
Сообщений: 2498
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

21 фев 11, 16:40    [10268540]     Ответить | Цитировать Сообщить модератору
 Re: Как ваша любимая БД сравнивает DATE и DATETIME ?  [new]
Le Peace
Member

Откуда: Москва
Сообщений: 8969
MasterZiv,

выше уже сказали, что нужно сравнивать не со строкой, а с явным datetime.
21 фев 11, 16:43    [10268572]     Ответить | Цитировать Сообщить модератору
 Re: Как ваша любимая БД сравнивает DATE и DATETIME ?  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34709

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

21 фев 11, 16:45    [10268590]     Ответить | Цитировать Сообщить модератору
 Re: Как ваша любимая БД сравнивает DATE и DATETIME ?  [new]
Le Peace
Member

Откуда: Москва
Сообщений: 8969
MasterZiv
On 21.02.2011 15:32, daw wrote:

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

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


Да в том-то и дело, что нет.
Если вы преобразуете в datetime явно, то получите другой результат (в случае MS SQL).
То есть строка преобразуется в date, а не в datetime.
21 фев 11, 16:48    [10268612]     Ответить | Цитировать Сообщить модератору
 Re: Как ваша любимая БД сравнивает DATE и DATETIME ?  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

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

приоритеты при всем. и не всегда в datetime.
с чего бы к datetime преобразовывать, если с другой стороны выражения - date.

Posted via ActualForum NNTP Server 1.4

21 фев 11, 16:52    [10268642]     Ответить | Цитировать Сообщить модератору
 Re: Как ваша любимая БД сравнивает DATE и DATETIME ?  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

> приоритеты при всем. и не всегда в datetime.
> с чего бы к datetime преобразовывать, если с другой стороны выражения - date.

да - это я про ms sql, конечно (начиная с 2000-ого sp4, по крайней мере). как в sybase не знаю.

Posted via ActualForum NNTP Server 1.4

21 фев 11, 17:00    [10268691]     Ответить | Цитировать Сообщить модератору
 Re: Как ваша любимая БД сравнивает DATE и DATETIME ?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 54803

daw
с чего бы к datetime преобразовывать, если с другой стороны выражения - date.

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

Posted via ActualForum NNTP Server 1.4

21 фев 11, 17:03    [10268703]     Ответить | Цитировать Сообщить модератору
 Re: Как ваша любимая БД сравнивает DATE и DATETIME ?  [new]
Зайцев Фёдор
Member

Откуда: Лужки
Сообщений: 5308
Dimitry Sibiryakov
daw
с чего бы к datetime преобразовывать, если с другой стороны выражения - date.

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

а должно? )
21 фев 11, 17:08    [10268736]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Сравнение СУБД Ответить