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

Задача простая как мычание:
Код: 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
Как ваша любимая БД сравнивает DATE и DATETIME ?
    #37128024
Зайцев Фёдор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ответ простой, как мычание
Код: 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
Как ваша любимая БД сравнивает DATE и DATETIME ?
    #37128038
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Firebird: ответы 1 и 4.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Как ваша любимая БД сравнивает DATE и DATETIME ?
    #37128420
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЗайцевФедорОтвет простой, как мычание
а что за СУБД так мычит? MSSQL?
...
Рейтинг: 0 / 0
Как ваша любимая БД сравнивает DATE и DATETIME ?
    #37128444
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovFirebird: ответы 1 и 4.

В завтрашних снапшотах уже должны быть правильные 1 и 5.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Как ваша любимая БД сравнивает DATE и DATETIME ?
    #37128475
kDnZP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Как ваша любимая БД сравнивает DATE и DATETIME ?
    #37128502
kDnZP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
* можно еще так:

Код: 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
Как ваша любимая БД сравнивает DATE и DATETIME ?
    #37128507
Фотография Le Peace
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kDnZP,

вопрос был про date, а у вас в таблице datetime
...
Рейтинг: 0 / 0
Как ваша любимая БД сравнивает DATE и DATETIME ?
    #37128516
Фотография Le Peace
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Как ваша любимая БД сравнивает DATE и DATETIME ?
    #37128528
kDnZP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Le Peace, у меня под рукой только Microsoft SQL Server 2005 и 2000... Там такого типа нет. Пусть кто-то другой потестит.
...
Рейтинг: 0 / 0
Как ваша любимая БД сравнивает DATE и DATETIME ?
    #37128545
Фотография daw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> 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
Как ваша любимая БД сравнивает DATE и DATETIME ?
    #37128553
Зайцев Фёдор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а что делает
автор
Код: 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
Как ваша любимая БД сравнивает DATE и DATETIME ?
    #37128570
Фотография Le Peace
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
daw, спасибо.

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

Это "якобы стандартный" синтаксис в ODBC, который якобы должны понимать или драйверы, или request broker-ы или компиляторы SQL-запросов, которые должны заменять его на cast (константа AS имя подходящего типа). На самом же деле, драйвер часто надеется, что этим займётся БД, а БД вовсе не хочет прогибаться под какие-то посторонние спеки. Саботаж усиливает то, что там есть и неудобные для реализации вещи, вроде {fn имя_якобы_стандартной_функции (аргументы)}, и никому не хочется делать лишнюю работу, в результате которой пользователям будет удобнее переходить на конкурирующие платформы :)
...
Рейтинг: 0 / 0
Как ваша любимая БД сравнивает DATE и DATETIME ?
    #37128707
Фотография daw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> интересно, а почему индекс используется, если столбец 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
Как ваша любимая БД сравнивает DATE и DATETIME ?
    #37128733
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Как ваша любимая БД сравнивает DATE и DATETIME ?
    #37128742
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Как ваша любимая БД сравнивает DATE и DATETIME ?
    #37128743
ОКТОГЕН
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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
Как ваша любимая БД сравнивает DATE и DATETIME ?
    #37128755
Фотография Le Peace
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,

выше уже сказали, что нужно сравнивать не со строкой, а с явным datetime.
...
Рейтинг: 0 / 0
Как ваша любимая БД сравнивает DATE и DATETIME ?
    #37128761
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Как ваша любимая БД сравнивает DATE и DATETIME ?
    #37128769
Фотография Le Peace
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Как ваша любимая БД сравнивает DATE и DATETIME ?
    #37128786
Фотография daw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Приоритеты тут ни при чём. Просто нету констант типа datetime, вместо них --
> строковые. Но они контекстно всегда преобразуются в datetime.

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

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

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

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

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


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