Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Дата и NULL значение  [new]
razliv
Member

Откуда:
Сообщений: 1243
Есть таблица, в ней есть поле типа smalldatetime

Запускаю один селект

  select COUNT(*)
  from table
  where date_field IS not null


2000 rows

Запускаю другой селект

  select COUNT(*)
  from table
  where ISNULL(date_field,0) <> 0


1600 rows

Ребята ничего не понимаю, почему is not null и функция isnull работают по разному ? это обьяснить можно ?
15 ноя 12, 12:05    [13477174]     Ответить | Цитировать Сообщить модератору
 Re: Дата и NULL значение  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Ну, дык, задайтесь вопросом, что будет, если всё же есть значения date_field = 0.

Сообщение было отредактировано: 15 ноя 12, 12:13
15 ноя 12, 12:13    [13477241]     Ответить | Цитировать Сообщить модератору
 Re: Дата и NULL значение  [new]
_djХомяГ
Guest
Например так
DECLARE @t table (d datetime)
insert into @t 
select null
union all
select null
union all
select '19000101'-----ATTENTION =0
union all
select '20121115'

select count(*) from @t where d is not null
select count(*) from @t where isnull(d,0)<>0
15 ноя 12, 12:15    [13477264]     Ответить | Цитировать Сообщить модератору
 Re: Дата и NULL значение  [new]
razliv
Member

Откуда:
Сообщений: 1243
SQL Server неявно конвертирует дату и число ? Мессир в восторге :)
Спасибо большое, была такая мысль, но подумал откуда в базе будут значения 1900/01/01 ? !
15 ноя 12, 12:28    [13477376]     Ответить | Цитировать Сообщить модератору
 Re: Дата и NULL значение  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
razliv
SQL Server неявно конвертирует дату и число ? Мессир в восторге :)
Вы хелп почитайте, возможно, поводов для восторга станет больше.
razliv
Спасибо большое, была такая мысль, но подумал откуда в базе будут значения 1900/01/01 ? !
Ваша база, вам виднее.
15 ноя 12, 12:31    [13477400]     Ответить | Цитировать Сообщить модератору
 Re: Дата и NULL значение  [new]
Зайцев Фёдор
Member

Откуда: Лужки
Сообщений: 5308
razliv
SQL Server неявно конвертирует дату и число ? Мессир в восторге :)

число в дату
15 ноя 12, 12:34    [13477420]     Ответить | Цитировать Сообщить модератору
 Re: Дата и NULL значение  [new]
Glory
Member

Откуда:
Сообщений: 104751
razliv
SQL Server неявно конвертирует дату и число ? Мессир в восторге :)

Он заботится о том, что вы не сделали явно.
15 ноя 12, 12:35    [13477424]     Ответить | Цитировать Сообщить модератору
 Re: Дата и NULL значение  [new]
razliv
Member

Откуда:
Сообщений: 1243
SQL Server вообще гениальная штука как я погляжу.

конвертируем строку в дату, дату в число.

'' --> 1900/01/01 --> 0

Гениально, товарищи оказываеться '' - это 1900/01/01, а 1990/01/01 это 0 .
Но самое интересно - это то что он делает эти все штучки неявно.
Разгребая legacy коды, ловлю такие вкусности.
Человек update поле даты, полем строки(получил из '' - 1900/01/01 ), красота :)

Для сравнения логика Оракла

select to_date('','YYYY-MM-DD') 
from dual


Результат - нулл.

with x_table as(
select to_date('1900-01-01','YYYY-MM-DD') d
from dual )

select *
from x_table 
where d = 0


ORA-00932: inconsistent datatypes: expected DATE got NUMBER : with x_table as( select to_date('1900-01-01','YYYY-MM-DD') d from dual ) select * from x_table where d = 0

Логично что число в дату нужно заставлять делать прога, а не автоматом :)
15 ноя 12, 12:49    [13477560]     Ответить | Цитировать Сообщить модератору
 Re: Дата и NULL значение  [new]
Glory
Member

Откуда:
Сообщений: 104751
razliv
Гениально, товарищи оказываеться '' - это 1900/01/01, а 1990/01/01 это 0 .

У вас есть свои идеи, какому числу должна соответствовать дата 1900/01/01 ?

razliv
Логично что число в дату нужно заставлять делать прога, а не автоматом :)

А еще логично для дат использовать не строки, а соответствующий тип данных
15 ноя 12, 12:51    [13477581]     Ответить | Цитировать Сообщить модератору
 Re: Дата и NULL значение  [new]
razliv
Member

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

Я даже готов примириться что date 1900/01/01 - это int 0.

Но с тем что база делает такую конвертацию за прога, а уж тем более
неявно конвертирует строку '' в дату 1900/01/01, простите этого я понять не могу.
15 ноя 12, 12:59    [13477657]     Ответить | Цитировать Сообщить модератору
 Re: Дата и NULL значение  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
razliv
Glory

Я даже готов примириться что date 1900/01/01 - это int 0.

Но с тем что база делает такую конвертацию за прога, а уж тем более
неявно конвертирует строку '' в дату 1900/01/01, простите этого я понять не могу.
Понимать не обязательно. Надо просто об этом знать.

http://msdn.microsoft.com/en-us/library/aa226054(v=sql.80).aspx
15 ноя 12, 13:04    [13477703]     Ответить | Цитировать Сообщить модератору
 Re: Дата и NULL значение  [new]
Glory
Member

Откуда:
Сообщений: 104751
razliv
неявно конвертирует строку '' в дату 1900/01/01, простите этого я понять не могу.

Это не проблема сервера, что вы не можете понять.
У сервера есть документированные правила неявной ковертации.
Это ваша проблема, что эти правила не совпадают с вашим взглядом.
Никто не запрещает вам проверять и конвертировать типы явно.
15 ноя 12, 13:06    [13477726]     Ответить | Цитировать Сообщить модератору
 Re: Дата и NULL значение  [new]
razliv
Member

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

Да, вполне логично, каждая база данных имеет свои правила игры :)
Это отличная крупица опыта в карман моих знаний, сегодня хорошо уяснил что бывает если
упустить явную конвертацию ! :)

Еще раз спасибо всем.
15 ноя 12, 13:36    [13477944]     Ответить | Цитировать Сообщить модератору
 Re: Дата и NULL значение  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3754
razliv
Для сравнения логика Оракла

А ничего что в оракле пустая строка и NULL эквивалентны - а в MSSQL НЕТ !!!!!!????????????
15 ноя 12, 13:44    [13477999]     Ответить | Цитировать Сообщить модератору
 Re: Дата и NULL значение  [new]
razliv
Member

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

Кстати да, это в Оракле тоже большая головная боль.
Но кстати пустая строка и NULL, это очень рядом, логично.

Но как бы пустая строка и 1900/01/01 - это экзотично :)
15 ноя 12, 13:56    [13478085]     Ответить | Цитировать Сообщить модератору
 Re: Дата и NULL значение  [new]
Glory
Member

Откуда:
Сообщений: 104751
razliv
Но как бы пустая строка и 1900/01/01 - это экзотично

А хранить даты в строках вообще эпично.
15 ноя 12, 13:58    [13478109]     Ответить | Цитировать Сообщить модератору
 Re: Дата и NULL значение  [new]
razliv
Member

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

автор
А хранить даты в строках вообще эпично.


ETL он такой ETL.
15 ноя 12, 14:56    [13478590]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить