Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) Проблема с DateTime (число прочтений - 4551 )
Glafira
Junior Member
**
Отсутствует


I Love 1С!

Сообщений: 45
Зарегистрирован: 29. Июня 2007
Пол: Женский
Проблема с DateTime
30. Мая 2008 :: 17:44
Печать  
Всем привет. Нужна помощь...
Есть 1С SQL. В конфе есть документ приказ, с реквизитами неопределенного вида табличной части НовыйПризнак и СтарыйПризнак. В зависимости от вида приказа туда записывается различные данные. Меня интересует отпуска сотрудников. Написала такой запросик и он успешно работал на SQL2000. Но тут решили перейти на SQL 2005 и этот запросик стал вылетать с ошибкой:
State 22007, native 241, message [Microsoft][ODBC SQL Server Driver][SQL Server]Conversion failed when converting datetime from character string.

Пробовала разные примочки типа SET DATEFORMAT и еще кучу всяких разностей - ничего не помогло...

Помогите люди добрые советом...

Код
Выбрать все
	ТекстЗапроса = "
	|SELECT
	|	Сотрудники.ID [Сотрудник $Справочник.Сотрудники],
	|   CAST(RIGHT(LTRIM(RTRIM($ПриказСтроки.СтарыйПризнак)), 8) as DateTime) НачалоБольничного,
	|   CAST(RIGHT(LTRIM(RTRIM($ПриказСтроки.НовыйПризнак)), 8) as DateTime) КонецБольничного
	|FROM
	|	$Документ.Приказ AS Приказ
	|INNER JOIN
	|	$ДокументСтроки.Приказ AS ПриказСтроки ON Приказ.IDDOC = ПриказСтроки.IDDOC
	|INNER JOIN
	|	_1SJOURN AS Журнал ON Приказ.IDDOC = Журнал.IDDOC
	|INNER JOIN
	|	$Справочник.Сотрудники AS Сотрудники ON $ПриказСтроки.Сотрудник = Сотрудники.ID
	|WHERE
	|	((Журнал.CLOSED & 1) = 1) AND
	|	($ПриказСтроки.Сотрудник IN (SELECT val FROM #СписокСотрудников)) AND
	|	($Приказ.ВидПриказа = $Перечисление.ВидыПриказов.Больничный) AND
	|	(Журнал.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~)"
	; 



  

Ваша Глаша
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3050
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Проблема с DateTime
Ответ #1 - 30. Мая 2008 :: 19:00
Печать  
Какой тип значений в реквизитах СтарыйПризнак и НовыйПризнак?
Интересует только дата?
  

1&&2&&3
Наверх
 
IP записан
 
Glafira
Junior Member
**
Отсутствует


I Love 1С!

Сообщений: 45
Зарегистрирован: 29. Июня 2007
Пол: Женский
Re: Проблема с DateTime
Ответ #2 - 30. Мая 2008 :: 19:31
Печать  
в 1С это неопределенный тип... в данном запросе интересуют только дата
  

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



Сообщений: 923
Местоположение: Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Проблема с DateTime
Ответ #3 - 30. Мая 2008 :: 19:50
Печать  
Странно почему он работал на 2000. По идее, если реквизит неопределенный то дата в него пишется слева с символом "D". Запрос по идее должен быть таким:
Код
Выбрать все
ТекстЗапроса = "
	|SELECT
	|	Сотрудники.ID [Сотрудник $Справочник.Сотрудники],
	|   CAST(SUBSTRING($ПриказСтроки.СтарыйПризнак, 2, 8) as DateTime) НачалоБольничного,
	|   CAST(SUBSTRING($ПриказСтроки.НовыйПризнак,  2, 8) as DateTime) КонецБольничного
	|FROM
	|	$Документ.Приказ AS Приказ
	|INNER JOIN
	|	$ДокументСтроки.Приказ AS ПриказСтроки ON Приказ.IDDOC = ПриказСтроки.IDDOC
	|INNER JOIN
	|	_1SJOURN AS Журнал ON Приказ.IDDOC = Журнал.IDDOC
	|INNER JOIN
	|	$Справочник.Сотрудники AS Сотрудники ON $ПриказСтроки.Сотрудник = Сотрудники.ID
	|WHERE
	|	((Журнал.CLOSED & 1) = 1) AND
	|	($ПриказСтроки.Сотрудник IN (SELECT val FROM #СписокСотрудников)) AND
	|	($Приказ.ВидПриказа = $Перечисление.ВидыПриказов.Больничный) AND
	|	(Журнал.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~)
        |	AND ($ПриказСтроки.СтарыйПризнак = 'D')
        |	AND ($ПриказСтроки.НовыйПризнак = 'D')"
	;
 

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


I Love 1С!

Сообщений: 45
Зарегистрирован: 29. Июня 2007
Пол: Женский
Re: Проблема с DateTime
Ответ #4 - 30. Мая 2008 :: 20:07
Печать  
Ответ ну я же тоже самое делаю только немного по другому:
RIGHT(LTRIM(RTRIM($ПриказСтроки.СтарыйПризнак)), 8)
  

Ваша Глаша
Наверх
 
IP записан
 
Glafira
Junior Member
**
Отсутствует


I Love 1С!

Сообщений: 45
Зарегистрирован: 29. Июня 2007
Пол: Женский
Re: Проблема с DateTime
Ответ #5 - 30. Мая 2008 :: 20:09
Печать  
о прозрение.... не поверите но вот  так замечательно сработало:
Код
Выбрать все
ТекстЗапроса = "
	|SELECT
	|	$ПриказСтроки.Сотрудник [Сотрудник $Справочник.Сотрудники],
	|   CAST(RIGHT(LTRIM(RTRIM($ПриказСтроки.СтарыйПризнак)), 8) as DateTime) НачалоБольничного,
	|   CAST(RIGHT(LTRIM(RTRIM($ПриказСтроки.НовыйПризнак)), 8) as DateTime) КонецБольничного
	|FROM
	|	$Документ.Приказ AS Приказ
	|INNER JOIN
	|	$ДокументСтроки.Приказ AS ПриказСтроки ON Приказ.IDDOC = ПриказСтроки.IDDOC
	|INNER JOIN
	|	_1SJOURN AS Журнал ON Приказ.IDDOC = Журнал.IDDOC
	|WHERE
	|	((Журнал.CLOSED & 1) = 1) AND
	|	($ПриказСтроки.Сотрудник IN (SELECT val FROM #СписокСотрудников)) AND
	|	($Приказ.ВидПриказа = $Перечисление.ВидыПриказов.Больничный) AND
	|	(Журнал.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~)"
	;
 



Какая-то засада с JOIN-ом по сотрудникам  Озадачен
  

Ваша Глаша
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3050
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Проблема с DateTime
Ответ #6 - 31. Мая 2008 :: 04:19
Печать  
Glafira писал(а) 30. Мая 2008 :: 19:31:
в 1С это неопределенный тип
То, что тип РЕКВИЗИТА неопределенный - это я заметил и в (0).
Я же спросил "Какой тип ЗНАЧЕНИЙ ".

Это имеет значение если там кроме дат 'D20080531              ' возможны и другие типы значений.
Например строки 'Sааббвв                ' или пустые 'U                      '.
При попытке скастить такие значения к datetime будет ошибка (Conversion failed...) и на 2000 и на 2005.

В зависимости от постановки задачи есть два варианта:

- ограничить выборку так как предложил pvase (с небольшими исправлениями)
WHERE ...
AND (LEFT($ПриказСтроки.СтарыйПризнак,1) = 'D')
AND (LEFT($ПриказСтроки.НовыйПризнак,1) = 'D')

- либо проводить выборочную кастомизацию
case when LEFT($ПриказСтроки.СтарыйПризнак,1) = 'D'
  then CAST(SUBSTRING($ПриказСтроки.СтарыйПризнак, 2, 8) as DateTime)
  else NULL
end НачалоБольничного
  

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



Сообщений: 923
Местоположение: Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Проблема с DateTime
Ответ #7 - 31. Мая 2008 :: 11:33
Печать  
trad писал(а) 31. Мая 2008 :: 04:19:
- ограничить выборку так как предложил pvase (с небольшими исправлениями)
WHERE ...
AND (LEFT($ПриказСтроки.СтарыйПризнак,1) = 'D')
AND (LEFT($ПриказСтроки.НовыйПризнак,1) = 'D')


Большое спасибо, а то ошибся и ввел человека в заблуждение, конечно же LEFT(,1).
  
Наверх
IP записан
 
Neo
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 327
Зарегистрирован: 12. Ноября 2007
Re: Проблема с DateTime
Ответ #8 - 03. Июня 2008 :: 06:49
Печать  
Есть реквизит:

|SELECT
|Max($СпрТов.ДатаИзмРознЦены) as [ДатаИзмРознЦены $Дата]

Как мне его сравнить с датой из формы отчета (НачДата)?

Т.е., надо сделать как-то так:

|HAVING Max($СпрТов.ДатаИзмРознЦены) > '" + НачДата + "'";

При таком варианте запрос (в зависимости от того, какую дату поставить в НачДата) или вываливает ошибку "The conversion of a char data type to a datetime data type resulted in an out-of-range datetime value.", или отрабатывает без ошибок, но данные выдает странные.

Как это можно сделать?  Ужас





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



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Проблема с DateTime
Ответ #9 - 03. Июня 2008 :: 07:01
Печать  
"|HAVING Max($СпрТов.ДатаИзмРознЦены) > :НачДата"
?
  
Наверх
 
IP записан
 
Neo
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 327
Зарегистрирован: 12. Ноября 2007
Re: Проблема с DateTime
Ответ #10 - 03. Июня 2008 :: 07:08
Печать  
Так пишет: Meta name parser error: не указан параментр ":НачДата"
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Проблема с DateTime
Ответ #11 - 03. Июня 2008 :: 07:15
Печать  
Ну так уствнови этот параметр:
Код
Выбрать все
Запрос.УстановитьТекстовыйПараметр("НачДата", ТвояДата); 

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


I Love YaBB 2!

Сообщений: 327
Зарегистрирован: 12. Ноября 2007
Re: Проблема с DateTime
Ответ #12 - 03. Июня 2008 :: 07:29
Печать  
Ага вроде заработало, спасибо  Подмигивание
Я думал, что так нельзя сранивать (т.е., тип даты  с тем, что возвращает УстТекстПараметр) , я так вначале и пробовал, но почему-то не получалось.

Сейчас потестю еще, благодарю за помощь  Улыбка
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать