Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Горячая тема (более 10 ответов) Or (Not(Выборка2.ДатаОплаты Is Null)) (число прочтений - 3771 )
al_zzz
Senior Member
****
Отсутствует


1C++ ->

Сообщений: 361
Местоположение: Барнаул
Зарегистрирован: 05. Сентября 2009
Пол: Мужской
Or (Not(Выборка2.ДатаОплаты Is Null))
20. Октября 2010 :: 06:16
Печать  
Подскажите, пожалуйста! Почему такое условие не работает? Как выбрать только те элементы выборки, у которых непустая дата?
При таком условии запрос выбирает все.
  

Каждая система проходит три стадии:&&1) Шумиха&&2) Неразбериха&&3) Поиск виновных (собственно, рабочий процесс)&&4) Наказание невиновных&&5) Награждение непричастных&& В.М. Глушков
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Or (Not(Выборка2.ДатаОплаты Is Null))
Ответ #1 - 20. Октября 2010 :: 06:28
Печать  
al_zzz писал(а) 20. Октября 2010 :: 06:16:
Подскажите, пожалуйста! Почему такое условие не работает? Как выбрать только те элементы выборки, у которых непустая дата?
При таком условии запрос выбирает все.


в 1с  пустая дата это не значение NULL
а дата 01.01.1753
для более полного ответа нужен конкретный запрос


т.е вместо
Or (Not(Выборка2.ДатаОплаты Is Null))

надо писать

Or (Выборка2.ДатаОплаты  <> cast('17530101' as datetime))
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Or (Not(Выборка2.ДатаОплаты Is Null))
Ответ #2 - 20. Октября 2010 :: 06:34
Печать  
al_zzz писал(а) 20. Октября 2010 :: 06:16:
Подскажите, пожалуйста! Почему такое условие не работает? Как выбрать только те элементы выборки, у которых непустая дата?
При таком условии запрос выбирает все.

Потому что такого условия в SQL нет!
зато есть конструкция IS NOT NULL

Z1 писал(а) 20. Октября 2010 :: 06:28:
al_zzz писал(а) 20. Октября 2010 :: 06:16:
Подскажите, пожалуйста! Почему такое условие не работает? Как выбрать только те элементы выборки, у которых непустая дата?
При таком условии запрос выбирает все.


в 1с  пустая дата это не значение NULL
а дата 01.01.1753
для более полного ответа нужен конкретный запрос


т.е вместо
Or (Not(Выборка2.ДатаОплаты Is Null))

надо писать

Or (Выборка2.ДатаОплаты  <> cast('17530101' as datetime))

Неправда твоя! NULL нельзя ни с чем сравнивать, кроме самого себя!
Кроме того, такой каст далеко не во всех БД сработает, а вопрошающий про БД ни слова не сказал...
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Or (Not(Выборка2.ДатаОплаты Is Null))
Ответ #3 - 20. Октября 2010 :: 06:52
Печать  
Dmitry The Wing писал(а) 20. Октября 2010 :: 06:34:
al_zzz писал(а) 20. Октября 2010 :: 06:16:
Подскажите, пожалуйста! Почему такое условие не работает? Как выбрать только те элементы выборки, у которых непустая дата?
При таком условии запрос выбирает все.

Потому что такого условия в SQL нет!
зато есть конструкция IS NOT NULL

Z1 писал(а) 20. Октября 2010 :: 06:28:
al_zzz писал(а) 20. Октября 2010 :: 06:16:
Подскажите, пожалуйста! Почему такое условие не работает? Как выбрать только те элементы выборки, у которых непустая дата?
При таком условии запрос выбирает все.


в 1с  пустая дата это не значение NULL
а дата 01.01.1753
для более полного ответа нужен конкретный запрос


т.е вместо
Or (Not(Выборка2.ДатаОплаты Is Null))

надо писать

Or (Выборка2.ДатаОплаты  <> cast('17530101' as datetime))

Неправда твоя! NULL нельзя ни с чем сравнивать, кроме самого себя!
Кроме того, такой каст далеко не во всех БД сработает, а вопрошающий про БД ни слова не сказал...

ты путаешь поля в родных 1с таблицах с типом дата (datetime)
идут с  check  not null
и мой ответ дан не абстрактно а в предположении что работа идет с родными 1с таблицами.
  
Наверх
 
IP записан
 
al_zzz
Senior Member
****
Отсутствует


1C++ ->

Сообщений: 361
Местоположение: Барнаул
Зарегистрирован: 05. Сентября 2009
Пол: Мужской
Re: Or (Not(Выборка2.ДатаОплаты Is Null))
Ответ #4 - 20. Октября 2010 :: 10:26
Печать  
Спасибо, Z1, помогло!
  

Каждая система проходит три стадии:&&1) Шумиха&&2) Неразбериха&&3) Поиск виновных (собственно, рабочий процесс)&&4) Наказание невиновных&&5) Награждение непричастных&& В.М. Глушков
Наверх
 
IP записан
 
pvase
God Member
*****
Отсутствует



Сообщений: 923
Местоположение: Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Or (Not(Выборка2.ДатаОплаты Is Null))
Ответ #5 - 20. Октября 2010 :: 10:35
Печать  
Можно писать без конвертации:
Код
Выбрать все
Or (Выборка2.ДатаОплаты  <> '17530101') 



SQL всегда дату в формате ISO понимает без преобразования, т.е. ГГГГММДД.
  
Наверх
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Or (Not(Выборка2.ДатаОплаты Is Null))
Ответ #6 - 20. Октября 2010 :: 10:52
Печать  
pvase писал(а) 20. Октября 2010 :: 10:35:
Можно писать без конвертации:
Код
Выбрать все
Or (Выборка2.ДатаОплаты  <> '17530101') 



SQL всегда дату в формате ISO понимает без преобразования, т.е. ГГГГММДД.

можно.
но не нужно так делать тем более советовать так делать.
Явное преобразование типов sql  во  всех отношениях  лучше чем неявное преобразование типов.

  
Наверх
 
IP записан
 
pvase
God Member
*****
Отсутствует



Сообщений: 923
Местоположение: Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Or (Not(Выборка2.ДатаОплаты Is Null))
Ответ #7 - 20. Октября 2010 :: 13:29
Печать  
Z1 писал(а) 20. Октября 2010 :: 10:52:
можно.
но не нужно так делать тем более советовать так делать.
Явное преобразование типов sql  во  всех отношениях  лучше чем неявное преобразование типов.



Возможно, просто мне еще не попадались глюки с таким преобразованием.
  
Наверх
IP записан
 
simply
God Member
*****
Отсутствует


Мечта: избавиться от 1С

Сообщений: 573
Местоположение: Киев
Зарегистрирован: 31. Декабря 2008
Пол: Мужской
Re: Or (Not(Выборка2.ДатаОплаты Is Null))
Ответ #8 - 20. Октября 2010 :: 13:38
Печать  
pvase писал(а) 20. Октября 2010 :: 13:29:
Z1 писал(а) 20. Октября 2010 :: 10:52:
можно.
но не нужно так делать тем более советовать так делать.
Явное преобразование типов sql  во  всех отношениях  лучше чем неявное преобразование типов.



Возможно, просто мне еще не попадались глюки с таким преобразованием.

Я в MySQL уже давно использую неявное преобразование даты. Тоже все в порядке.
При чем, передаю как число, но без разделителей: 20101020, так и строку: "20101020" или "2010-10-20".

ИМХО, чем меньше умышленых преобразований в запросе, тем лучше.
  
Наверх
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Or (Not(Выборка2.ДатаОплаты Is Null))
Ответ #9 - 20. Октября 2010 :: 14:38
Печать  
Цитата:
Избегайте неявных преобразований типов данных
При использовании переменных для фильтрации данных в предложении WHERE, следует избегать сравнений на двух различных типах данных, которые вынудят SQL Server выполнять неявное преобразование типа данных. Если возможно, опишите переменную с типом данных, соответствующим типу данных столбца, по которому выполняется фильтрация. Отрицательным примером может служить установка для столбца типа данных INTEGER, а затем его использование для фильтрации по типу данных float или decimal. Неявное преобразование дорого обходится и может вызвать значительную нагрузку при больших наборах данных.

См. BOL: Data Type Conversion, CAST and CONVERT, and Conversion Functions

вся статья  http://www.interface.ru/home.asp?artId=5809
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Or (Not(Выборка2.ДатаОплаты Is Null))
Ответ #10 - 20. Октября 2010 :: 14:48
Печать  
Есличо, неявное преобразование обходится не дороже явного. И в данном случае речь идёт о константах, а не о "больших наборах данных", т.ч. эта стоимость пренебрежимо мала.
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
simply
God Member
*****
Отсутствует


Мечта: избавиться от 1С

Сообщений: 573
Местоположение: Киев
Зарегистрирован: 31. Декабря 2008
Пол: Мужской
Re: Or (Not(Выборка2.ДатаОплаты Is Null))
Ответ #11 - 20. Октября 2010 :: 15:01
Печать  
Z1, спасибо за интересную статью!

Поддерживаю berezdetsky.
Я не великий специалисть по SQL, но мне кажется, что это скорее "хороший тон", чем обязанность, особенно по отношению к формату даты.
CAST("20101020") будет не легче, чем неявное форматирование.
Если уж так пошло, то идеальным для сервера будет
Код
Выбрать все
SELECT DATE("2010-10-20") 

  
Наверх
IP записан
 
pvase
God Member
*****
Отсутствует



Сообщений: 923
Местоположение: Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Or (Not(Выборка2.ДатаОплаты Is Null))
Ответ #12 - 20. Октября 2010 :: 19:27
Печать  
Скорее всего да, если следовать стандарту языка SQL (не помню названия и номера), то лучше конечно же использовать преобразование в явном виде. Да и сам стараюсь везде где возможно использовать переменные с присвоением им явно типа с конвертацией:
Код
Выбрать все
DECLARE @D DateTime
SET @D = Convert(DateTime,'20101020',112) 



а потом уже переменную использовать в запросе. Хотя это дело привычки. Но судя по всему MS SQL все таки идет к стандартам, убирают старые варианты связей ( := ), да и не только их, так что надо учиться писать по стандартам, чтобы код работал и через 10 лет на SQL 2020  Улыбка.

Z1 писал(а) 20. Октября 2010 :: 14:38:


Что характерно, 1С 7.7 почти по всем параметрам идет в разрез с этими рекомендациями Улыбка.
  
Наверх
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Or (Not(Выборка2.ДатаОплаты Is Null))
Ответ #13 - 21. Октября 2010 :: 00:53
Печать  
Во маньяки. Из ничего раздули целое обсуждение.
В начальном топике поднимался вопрос о сравнении с пустым значением, что для любых БД правильнее всего делается именно через "сравнение с пустым значением" (тавтология получилась).
т.е. если надо получить записи только с пустым значением:
Код
Выбрать все
WHERE field_value IS NULL 

и при обратном условии
Код
Выбрать все
WHERE field_value IS NOT NULL 

... а вы увели все к представлению и преобразованию даты ... вопрос то был в другом: "почему не работает неправильное условие?".

И утверждение:
Z1 писал(а) 20. Октября 2010 :: 06:28:
в 1с  пустая дата это не значение NULL
а дата 01.01.1753

Неверно. Не надо путать причину и следствие. Дата пустая, но в 1С принято представлять пустую дату в виде описанной выше, а не наоборот - ставить ее вместо пустого значения...
  
Наверх
 
IP записан
 
Salimbek
God Member
*****
Отсутствует



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: Or (Not(Выборка2.ДатаОплаты Is Null))
Ответ #14 - 21. Октября 2010 :: 04:57
Печать  
Dmitry The Wing писал(а) 21. Октября 2010 :: 00:53:
Z1 писал(а) 20. Октября 2010 :: 06:28:
в 1с  пустая дата это не значение NULL
а дата 01.01.1753

Неверно. Не надо путать причину и следствие. Дата пустая, но в 1С принято представлять пустую дату в виде описанной выше, а не наоборот - ставить ее вместо пустого значения...

Т.е. если ты откроешь свою базу 1С на SQL и найдешь там дату, равную NULL? У меня, например, не получилось. Или твой поток сознания требует дополнительной расшифровки.
  
Наверх
ICQ  
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать