Имя: Пароль:
1C
1C 7.7
v7: CONVERT в WHERE строка-дата
0 serpentt
 
04.01.19
15:52
Здравствуйте, подскажите, как прописать условие в запросе

есть в таблице Реквизит СТРОКА
2019-01-01
2019-01-01
2019-10-05
2019-01-01
2018-04-21

в SELECT я его получаю

CONVERT(DateTime,$СпрПартии.ДатаСрокГодности1,102)

если добавить в условие
NtrL=ТекущаяДата()

WHERE
   CONVERT(DateTime,$СпрПартии.ДатаСрокГодности1,102) <= :NtrL

И под условие выборки не попадает ничего, получаю ошибку

State 22007, native 242, message [Microsoft][ODBC SQL Server Driver][SQL Server]The conversion of a char data type to a datetime data type resulted in an out-of-range datetime value.

как в Запросе учесть что записей подходящих под данное условие нет?
1 zmaximka
 
04.01.19
16:02
Ntrl преобразуй в строку Формат(ГГГГ-ММ-ДД)
2 Sserj
 
04.01.19
16:10
МетаДата = СоздатьОбъект("MetaDataWork");
датаСтрокой = МетаДата.ПолучитьСтрИзДаты(ТекущаяДата());

"
..
WHERE
    REPLACE ($СпрПартии.ДатаСрокГодности1,'-','') < " + датаСтрокой
3 Sserj
 
04.01.19
16:11
+(2)
Точнее так:
< '" + датаСтрокой + "'"
4 serpentt
 
04.01.19
16:12
(2) Спасибо пробую
5 Sserj
 
04.01.19
16:13
Ну и еще учесть сколько там пробелов.
Если SQL 2012 и выше то
  RTRIM (REPLACE ($СпрПартии.ДатаСрокГодности1,'-',''))

Если ниже то
  LTRIM(RTRIM(REPLACE..))
6 Sserj
 
04.01.19
16:16
Нельзя писать на форум в праздники :)

Это с SQL 2017 появилась TRIM(), обрезающая слева и с права все.
Все что раньше только
LTRIM(RTRIM())
7 serpentt
 
04.01.19
16:22
(6)
Нет это не работает

повторюсь, даны данные с Датой в виде строки "2018-04-21"

если делать выборку без условия даты, то все получаем.
Если делать выборку с условием проверки Даты(которая строка) и в выборке есть данные... все ОК

НО как только задаеш дату в условии, до которой нет данных, получаем ошибку.
8 serpentt
 
04.01.19
16:23
2018-04-01
2018-04-02
2018-04-03
2018-04-04
2018-04-05


Если условие Дата < 2018-04-04 ОК
если условие Дата < 2018-04-01 ERR
9 Sserj
 
04.01.19
16:25
(7) Так тогда весь запрос нужен. Если нет данных и ошибка то видимо это у тебя подзапрос который должен возвращать какое то скалярное выражение, а когда ничего нет то что-то падает.
10 serpentt
 
04.01.19
16:33
(9)
SELECT
|   СпрПартии.ID as [ВСД_Партия $Справочник.ВСД_Партия],
|    $СпрПартии.ДатаСрокГодности1,
|    CONVERT(DateTime,$СпрПартии.ДатаСрокГодности1,102),
|    REPLACE ($СпрПартии.ДатаСрокГодности1,'-','')
|FROM     $Справочник.ВСД_Партия AS СпрПартии
|WHERE
|    REPLACE ($СпрПартии.ДатаСрокГодности1,'-','') < '"+датаСтрокой+"'
|    and (СпрПартии.IsMark = 0)
|    AND ($СпрПартии.Количество > 0 )
11 Sserj
 
04.01.19
17:32
(10) А мне кажется у тебя в справочнике есть записи с пустой ДатаСрокГодности1. Такие записи в любом случае будут меньше любой строки и в итоге у тебя вот сюда:
CONVERT(DateTime,$СпрПартии.ДатаСрокГодности1,102)
попадает пустая строка, соответснно ошибка.
Поэтому добавь еще в условие
and NOT (LTRIM(RTRIM($СпрПартии.ДатаСрокГодности1)) = '')
12 serpentt
 
04.01.19
17:36
CONVERT(DateTime,$СпрПартии.ДатаСрокГодности1,102)

один его пробовал
С пустой датой нет

в итоге перевел на TOYSQL
С ним все работает


|SELECT
|    ВСД_Партия = [СпрПартии.Ссылка],
|    Продукция_Элемент = [СпрПартии.Продукция_Элемент],
|    ПолеСортировки = [СпрПартии."+ПолеСортировки+"],
|    Количество = [СпрПартии.Количество],
|    КоличествоМест = [СпрПартии.КоличествоМест]
|FROM
|    [Справочник.ВСД_Партия] СпрПартии WITH (NOLOCK)
|WHERE
|    "+ОтборПоЭлементам+"
|    AND [СпрПартии.Количество] > 0
|    AND [СпрПартии.ПометкаУдаления] = 0
|    AND [СпрПартии.Получатель_Площадка] = [@ВыбПлощадка]
|    AND [СпрПартии.Получатель_ХозСубъект] = [@ВыбХС]
|
|    AND (REPLACE (SUBSTRING([СпрПартии.ДатаСрокГодности1],1,10),'-','') < '"+датаСтрокой+"')
|    
|ORDER BY [СпрПартии."+ПолеСортировки+"] "+_ЗнакСортировки+"    
|";

Всеравно спасибо
13 ADirks
 
09.01.19
09:42
(0) Надо почитать доку, Приложение А / Спецификация параметров.
д.б.

WHERE
   CONVERT(DateTime,$СпрПартии.ДатаСрокГодности1,102) <= :NtrL~~