ХП, Error converting datetime from character string

# Darth Vader #

Вот ХП котору. соорудил для выборки нужного поля таблицы вместе с полем ДатыВремени. Производится выборка по ДатеВремени. Но VB ругается (название топика)Вот ХПCREATE PROCEDURE GetTechnoValue @TParam char(20) ,@start DATETIME, @finish DATETIME asDECLARE @SQL CHAR(100)SET @SQL = 'SELECT TimeSt,' + @TParam +' from NewTable1 WHERE ([TimeSt] BETWEEN '+@start+' AND '+ @finish+ ' AND DATEPART(hh, [TimeSt]) BETWEEN 00 AND 24)'exec(@SQL)GOВызываю ее верно, все три параметра в скобкахcmdTechno.ActiveConnection = conn2cmdTechno.CommandType = adCmdStoredProccmdTechno.CommandText = "GetTechnoValue(" & "'AI128'," & start & "," & finish & ")"Где ошибка? Уважаемые гуру.
18 ответов

# Darth Vader #

'+@start+' Если вы желаете склеивать тидп данных char с типом данных datetime, то придется таки явно преобразовать datetime к типу char


# Darth Vader #

Как сконвертить?


# Darth Vader #

используя стандартную документированную(!) функцию CONVERT


# Darth Vader #

Спасибо.


# Darth Vader #

Грабли.Исправил ХП на этоCREATE PROCEDURE GetTechnoValue @TParam char(50) ,@start DATETIME, @finish DATETIME asDECLARE @SQL CHAR(300)SET @SQL = 'SELECT TimeSt,' + @TParam +' from NewTable1 WHERE ([TimeSt] BETWEEN '+CONVERT(char(15),@start)+' AND '+ CONVERT(char(15),@finish)+ ' AND DATEPART(hh, [TimeSt]) BETWEEN 00 AND 24)'/*return @@rowcount*/EXEC(@SQL)GOи пишет мне Incorrect Syntax Near <Указывает на место в конце первое даты>


# Darth Vader #

Во-первых, дата должна быть в кавычках, а потом, незабудьте про третий параметр в Convert.


# Darth Vader #

Прежде чем бросаться сразу делать EXEC(@SQL) заменитт его сначала на print(@SQL). И посмотрите текст динамического запроса, который вы собираетесь запускать. Можете его скопировать в другое окно QA и нажать кнопку проверки синтаксиса


# Darth Vader #

В одинарных апострофах, конечно же.
SET @SQL = 'SELECT TimeSt,' + @TParam +' from NewTable1 WHERE ([TimeSt] BETWEEN '''+CONVERT(char(<b>15</b>),@start)+''' AND '''+ CONVERT(char(<b>15</b>),@finish)+ ''' AND DATEPART(hh, [TimeSt]) BETWEEN 00 AND 24)'


# Darth Vader #

2 pkarklinНе понял чуть чуть. В каком месте кавычки надо еще поставить? А третий параметр для чего и что в нем указать?


# Darth Vader #

Сейчас...


# Darth Vader #

2 pkarklinА третий параметр для чего и что в нем указать?
CONVERT ( data_type [ ( length ) ] , expression [ , style ] )...styleIs the style of date format used to convert datetime or smalldatetime data to character data (nchar, nvarchar, char, varchar, nchar, or nvarchar data types), or the string format when converting float, real, money, or smallmoney data to character data (nchar, nvarchar, char, varchar, nchar, or nvarchar data types).


# Darth Vader #

Исправил на CREATE PROCEDURE GetTechnoValue @TParam char(50) ,@start DATETIME, @finish DATETIME asDECLARE @SQL CHAR(300)SET @SQL = 'SELECT TimeSt,' + @TParam +' from NewTable1 WHERE ([TimeSt] BETWEEN '''+CONVERT(char(15),@start)+ ''' AND '''+CONVERT(char(15),@finish)+''' AND DATEPART(hh, [TimeSt]) BETWEEN 00 AND 24)'/*return @@rowcount*/EXEC(@SQL)GOТаже ошибка, вот возни то привалило.


# Darth Vader #

В каком виде передаете даты? Где третий параметр в CONVERT?


# Darth Vader #

Передаю даты в виде строки в ковычках ' ' например вот дата '20040603'А в третьем параметре пока ничего не указывал. В хелпе там в примере тоже только два параметра. А что в третьем параметре CONVERT указать?


# Darth Vader #

...


# Darth Vader #

А в третьем параметре пока ничего не указывал. В хелпе там в примере тоже только два параметра. А что в третьем параметре CONVERT указать?Вы хоть смотрели что и какой длиын вам возвращает ваш CONVERT(char(15),@start) ? Неужели так трудно перед выполнением запроса вывести его текст ? А не гадать на кофейной гуще что именно вы предлагаете серверу выпонить в динамическом запросе ?


# Darth Vader #

Вы правы, просто спешу.Хорошо,как это текст запроса увидеть в QA?


# Darth Vader #

Вместо Exec(@SQL) напишите SELECT @SQL. И объявляйте переменную как varchar.