Где предложение терпит неудачу при использовании с функцией 'convert' - PullRequest
1 голос
/ 28 марта 2019

Я конвертирую поле varchar, представляющее дату в дату и время, и использую его в предложении "where - between".

Я получаю:

Ошибка преобразования при преобразовании даты и / или времени из символа строка

Мое where предложение:

select
screen_date
from d8003
where convert(datetime, screen_date, 120) between '6/1/2018' and '12/31/2018'

Как мне решить эту проблему?

Ответы [ 4 ]

1 голос
/ 28 марта 2019

Попробуйте использовать следующий синтаксис (используйте формат даты ГГГГММДД вместо ММ / ДД / ГГГГ):

select
screen_date
from d8003
where convert(datetime, screen_date, 120) between '20180601' and '20181231'

Если вы все еще получаете ту же ошибку, то убедитесь, что вы используете правильный код формата даты:

0 голосов
/ 28 марта 2019

Спасибо за все предложения и помощь, которую вы предложили.Я рад сообщить вам, что нашел решение.Вот мой код:

где try_cast (screen_date как smalldatetime) между '2018-06-01' и '2018-12-31'

Это предложение от коллеги, которыйимеет многолетний опыт работы.(Я только начал кодировать в SQL ....)

Это было предложение от одного из вас ранее, я не уверен, почему это не сработало тогда.

Deguza

0 голосов
/ 28 марта 2019

Используйте TRY_CAST , если вы не уверены, что значение действительно может быть преобразовано.

Но учтите, что тот факт, что вы получаете эту ошибку, вероятно, указывает на проблему с определенными записямив вашей колонке.Используйте TRY_CAST только в том случае, если вас интересует только получение записей, в которых столбец varchar может быть фактически преобразован в дату и время.

SELECT
    [screen_date]
FROM
    [d8003]
WHERE
    TRY_CAST([screen_date] AS DATETIME) BETWEEN '6/1/2018' AND '12/31/2018'
0 голосов
/ 28 марта 2019

До 2005 года возможности обработки ошибок были очень ограниченными. Для SQL 2005+ это должно работать

declare 
     @date_value varchar(50)
    ,@tmp datetime;
declare x cursor local fast_forward 
for
select screen_date from d8003

open x;
fetch next from x into @date_value;
while @@fetch_status = 0
    begin
        begin try
            set @tmp = convert(datetime,@date_value, 120)
        end try
        begin catch
            select 'This one is bad! Please fix me!! (' + rtrim(@date_value) + ')' bad_values;
        end catch
        fetch next from x into @date_value;
    end
close x;
deallocate x;
GO

Это вернет ваши неверные данные в SQL 2012+ try_convert, вернет ноль для неконвертируемых строк.

select 
    try_convert(datetime, screen_date, 120) mytryconvert
    ,screen_date
from d8003
where try_convert(datetime, screen_date, 120) is null

Вы можете исправить данные вручную или встроенным способом с помощью строки.

...