Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Горячая тема (более 10 ответов) Почему так? (число прочтений - 5853 )
U_zer
Экс-Участник


Почему так?
16. Января 2008 :: 13:32
Печать  
Всем привет!

Почему-то в последнее время появилась ошибка в условиях вида:

Код
Выбрать все
 ......
 and $Тов.ДатаИзм between :ДНач and :ДКон~

Запрос.УстановитьТекстовыйПараметр("ДНач", ДатаНач)
Запрос.УстановитьТекстовыйПараметр("ДКон", ДатаКон)
 



Ошибка: Syntax error converting datetime from character string

Раньше такое работало.
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Почему так?
Ответ #1 - 16. Января 2008 :: 13:40
Печать  
А как эта строка после парсера выглядит?
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
sadovnikov
1c++ power user
Отсутствует


I Love YaBB 2!

Сообщений: 420
Зарегистрирован: 06. Марта 2007
Re: Почему так?
Ответ #2 - 16. Января 2008 :: 13:49
Печать  
При использовании ДКон~ получаем строку вида "01011980Z".
Скуль, разумеется, эту строку в дату преобразовать не может. Вот и ругается.
  
Наверх
 
IP записан
 
U_zer
Экс-Участник


Re: Почему так?
Ответ #3 - 16. Января 2008 :: 14:08
Печать  
sadovnikov писал(а) 16. Января 2008 :: 13:49:
При использовании ДКон~ получаем строку вида "01011980Z".
Скуль, разумеется, эту строку в дату преобразовать не может. Вот и ругается.


Преобразует, поучаем

Код
Выбрать все
Тов.sp3069 between '20080114' and '20080116Z'
 



1) Почему такого раньше не было?
2) Как надо написать правильно?
  
Наверх
 
IP записан
 
sadovnikov
1c++ power user
Отсутствует


I Love YaBB 2!

Сообщений: 420
Зарегистрирован: 06. Марта 2007
Re: Почему так?
Ответ #4 - 16. Января 2008 :: 14:13
Печать  
1) Почему такого раньше не было?  - вот уж не знаю Улыбка

2) Как надо написать правильно?
Например, так:
and $Тов.ДатаИзм between :ДНач and :ДКон

Запрос.УстановитьТекстовыйПараметр("ДНач", ДатаНач)
Запрос.УстановитьТекстовыйПараметр("ДКон", ДатаКон+1)

Вообще, на сколько мне известно, тот же Хендерсон не рекомендует использовать between. Все равно оптимизатор разобьет его на 2 условия.
Я вот так обычно пишу:
"$Тов.ДатаИзм > '"+Формат(ДНач, "ДГГГГММДД")+"' And $Тов.ДатаИзм < '"+Формат(ДКон+1, "ДГГГГММДД")+"'

P.S. Выше, конечно, лопухнулся. Не
"получаем строку вида "01011980Z". "
а
"получаем строку вида "19800101Z".
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Почему так?
Ответ #5 - 16. Января 2008 :: 14:16
Печать  
sadovnikov писал(а) 16. Января 2008 :: 14:13:
Вообще, на сколько мне известно, тот же Хендерсон не рекомендует использовать between. Все равно оптимизатор разобьет его на 2 условия.


А если индекс по дате?
  
Наверх
 
IP записан
 
sadovnikov
1c++ power user
Отсутствует


I Love YaBB 2!

Сообщений: 420
Зарегистрирован: 06. Марта 2007
Re: Почему так?
Ответ #6 - 16. Января 2008 :: 14:18
Печать  
kiruha писал(а) 16. Января 2008 :: 14:16:
А если индекс по дате?


Не совсем понял вопроса...
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Почему так?
Ответ #7 - 16. Января 2008 :: 14:19
Печать  
sadovnikov писал(а) 16. Января 2008 :: 14:13:
1) Почему такого раньше не было?  - вот уж не знаю Улыбка

2) Как надо написать правильно?
Например, так:
and $Тов.ДатаИзм between :ДНач and :ДКон

Запрос.УстановитьТекстовыйПараметр("ДНач", ДатаНач)
Запрос.УстановитьТекстовыйПараметр("ДКон", ДатаКон+1)

Вообще, на сколько мне известно, тот же Хендерсон не рекомендует использовать between. Все равно оптимизатор разобьет его на 2 условия.
Я вот так обычно пишу:
"$Тов.ДатаИзм > '"+Формат(ДНач, "ДГГГГММДД")+"' And $Тов.ДатаИзм < '"+Формат(ДКон+1, "ДГГГГММДД")+"'

P.S. Выше, конечно, лопухнулся. Не
"получаем строку вида "01011980Z". "
а
"получаем строку вида "19800101Z".

Ну не знаю, SQL нормально должен отрабатывать конструкцию вида Тов.sp3069 between '20080114' and '20080116Z'

а в твоём примере не попадают Тов с ДатаИзм = ДНач, т.е. ты, наверное хотел написать так:
Цитата:
"$Тов.ДатаИзм > '"+Формат(ДНач-1, "ДГГГГММДД")+"' And $Тов.ДатаИзм < '"+Формат(ДКон+1, "ДГГГГММДД")+"'
?
  
Наверх
 
IP записан
 
U_zer
Экс-Участник


Re: Почему так?
Ответ #8 - 16. Января 2008 :: 14:20
Печать  
sadovnikov писал(а) 16. Января 2008 :: 14:13:
1) Почему такого раньше не было?  - вот уж не знаю Улыбка


Потому что раньше работало правильно, если судить по доке.

Цитата:
Правила обозначения модификаторов:

Передано значение типа Дата:

:ДатаНачала = '20030613'
:ДатаКонца ~ = '20030613Z'


  
Наверх
 
IP записан
 
sadovnikov
1c++ power user
Отсутствует


I Love YaBB 2!

Сообщений: 420
Зарегистрирован: 06. Марта 2007
Re: Почему так?
Ответ #9 - 16. Января 2008 :: 14:22
Печать  
JohnyDeath писал(а) 16. Января 2008 :: 14:19:
Ну не знаю, SQL нормально должен отрабатывать конструкцию вида Тов.sp3069 between '20080114' and '20080116Z'


Неа, не отрабатывает. Уже сталкивались.

JohnyDeath писал(а) 16. Января 2008 :: 14:19:
а в твоём примере не попадают Тов с ДатаИзм = ДНач, т.е. ты, наверное хотел написать так:
"$Тов.ДатаИзм > '"+Формат(ДНач-1, "ДГГГГММДД")+"' And $Тов.ДатаИзм < '"+Формат(ДКон+1, "ДГГГГММДД")+"'


Да, разумеется. Именно так. Привык к отборам по полю Date_Time_IDDOC Печаль
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Почему так?
Ответ #10 - 16. Января 2008 :: 14:27
Печать  
U_zer, а попробуй поставь в параметрах Эсины "Число цифр года в представлении даты"=4. Помнится что-то подобное у меня было, но что точно не помню...
  
Наверх
 
IP записан
 
sadovnikov
1c++ power user
Отсутствует


I Love YaBB 2!

Сообщений: 420
Зарегистрирован: 06. Марта 2007
Re: Почему так?
Ответ #11 - 16. Января 2008 :: 14:30
Печать  
JohnyDeath писал(а) 16. Января 2008 :: 14:27:
U_zer, а попробуй поставь в параметрах Эсины "Число цифр года в представлении даты"=4. Помнится что-то подобное у меня было, но что точно не помню...


Не проканает...
Ну сами проведите эксперимент типа:
Select *
From докЗаказТовараУПоставщика
Where
     ПлановаяДатаОтгрузки > '19800101Z'

А потом буковку Z уберите.
ПлановаяДатаОтгрузки  в 1С должна иметь тип "Дата".
  
Наверх
 
IP записан
 
U_zer
Экс-Участник


Re: Почему так?
Ответ #12 - 16. Января 2008 :: 14:39
Печать  
Если использовать :ДКон~ при работе с ВТ, то все работает нормально.

Может это как-то связано с Collation базы?
  
Наверх
 
IP записан
 
sadovnikov
1c++ power user
Отсутствует


I Love YaBB 2!

Сообщений: 420
Зарегистрирован: 06. Марта 2007
Re: Почему так?
Ответ #13 - 16. Января 2008 :: 14:41
Печать  
Цитата:
Если использовать :ДКон~ при работе с ВТ, то все работает нормально.

Может это как-то связано с Collation базы?


По какому полю сравнение при этом делаешь? Тип данных какой?
Подозреваю, что строка. Date_Time_IDDOC...
  
Наверх
 
IP записан
 
U_zer
Экс-Участник


Re: Почему так?
Ответ #14 - 16. Января 2008 :: 14:45
Печать  
sadovnikov писал(а) 16. Января 2008 :: 14:41:
Цитата:
Если использовать :ДКон~ при работе с ВТ, то все работает нормально.

Может это как-то связано с Collation базы?


По какому полю сравнение при этом делаешь? Тип данных какой?
Подозреваю, что строка. Date_Time_IDDOC...


Для неработающего случая - сравнение по реквизиту справочника, тип Дата.
для работающего случая, то есть ВТ - это просто первый параметр ВТ Остатки.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать