2016-01-29 1 views
0

Я попытался разрешить ошибку для кода ниже, но не знаю, как это сделать.Ошибка: преобразование не удалось при преобразовании даты и/или времени из символьной строки (происходит внутри в предложении where)

В том месте, где я проверил строки concat, которые возвращают дату в строковых форматах, но ошибка происходит где-то в преобразовании.

Может кто-нибудь, пожалуйста, дайте мне знать, где и как решить эту проблему.

Подсказка: ERSConstructedVariable_ExecutionDate - datetime Тип данных в таблице.

@OutputTimeDimensionvalue = '1989 - 1998'

Код:

SELECT 
    Column1, column2, column3 
FROM 
    Table1 CV 
WHERE 
    CV.ERSConstructedVariable_ExecutionDate 
     BETWEEN CONVERT(datetime2, CONCAT(substring(@OutputTimeDimensionvalue, 1, 4), '-01', '-01')) 
      AND CONVERT(datetime2,CONCAT((substring (@OutputTimeDimensionvalue, 7, 4)), '-01', '-01')) 
+0

Никогда не используйте 'CONVERT' против даты без номера преобразования. См. Здесь: https://msdn.microsoft.com/en-us/library/ms187928.aspx выберите правильный формат и используйте его. Если вы удаляете разделители '-' в целом, вы можете использовать формат 112. Обратите внимание, что' datetime2' также имеет компонент времени. Возможно, тип данных «дата» будет лучше? –

+0

@ Nick.McDermaid. , , Хотя я согласен с тем, что номера конверсий являются хорошей идеей, SQL Server имеет встроенные форматы, которые легко конвертируются * независимо от других настроек *. Таким образом, стандартные форматы ANSI, такие как YYYYMMDD (и почти при всех обстоятельствах YYYY-MM-DD), легко поддерживаются, как и YYYY-MM-DDTHH: MM: SS. –

ответ

1

Если я правильно понимаю, второй год начинается в положении 8, а не 7. Тем не менее, попробуйте left() и right() вместо:

SELECT Column1, column2, column3 
FROM Table1 CV 
WHERE CV.ERSConstructedVariable_ExecutionDate BETWEEN 
      CONVERT(datetime2, CONCAT(LEFT(@OutputTimeDimensionvalue, 4), '-01-01')) AND 
      CONVERT(datetime2, CONCAT(RIGHT(@OutputTimeDimensionvalue, 4), '-01-01')) 
+0

@ GowthamRamamoorthy Небольшое наблюдение, диапазон дат окончания 'ExecutionDate' может быть 12-31 вместо 01-01 – Eric

+0

Снова .. никогда не используйте' CONVERT' с датами без номера преобразования. –

1

Никогда не используйте CONVERT против даты без номера конверсии

https://msdn.microsoft.com/en-us/library/ms187928.aspx

Учитывая, что @OutputTimeDimensionvalue = '1989 - 1998' я предлагаю следующий код:

SELECT Column1,column2,column3 
FROM Table1 CV 
WHERE 
CV.ERSConstructedVariable_ExecutionDate 
BETWEEN CONVERT(
    datetime2, 
    CONCAT(substring(@OutputTimeDimensionvalue,1,4),'0101'), 
    112 
) AND 
CONVERT(
    datetime2, 
    CONCAT((substring (@OutputTimeDimensionvalue,8,4)),'0101'), 
    112 
) 
Смежные вопросы

 Смежные вопросы