Итак, у меня есть базовая таблица, которая выглядит примерно так.SQL Server, представления и преобразования даты и времени
SELECT [BILL_MONTH]
,[BILL_YEAR]
,[BILLED]
FROM bill_Detail
Все есть варчар.
Я создал представление, основанное на этой таблице, которое преобразует год счета и вексель в поле даты и времени. Конечно, поля bill_month и bill_year имеют некоторые данные дерьма, которые не конвертируются, поэтому в определении моего представления я имею следующее предложение WHERE.
WHERE ISDATE(CONVERT(varchar(4), BILL_YEAR) + '-' + CONVERT(varchar(3), BILL_MONTH) + '-1') = 1
Вид работает как чемпион, когда я делаю простой выбор на нем. Нет плохих дат, все очищено и т. Д. Однако, когда я пытаюсь выполнить любую арифметику даты (dateadd, датированный), я начинаю получать ошибки преобразования.
EDIT: Добавление в реальных целях и тест оператора выбора:
код для представления
SELECT ID
,BILLED
,Payment_Type
,CONVERT(datetime, CONVERT(varchar(4), BILL_YEAR) + '-' + CONVERT(varchar(3), BILL_MONTH) + '-1')
AS BillDate FROM dbo.Detail AS d WHERE ISDATE(CONVERT(varchar(4), BILL_YEAR) + '-' + CONVERT(varchar(3), BILL_MONTH) + '-1') = 1 AND ISNULL(Payment_Code,'') = '' AND Payment_Type in ('D','I')
Здесь оператор выбора, который раздувает.
SELECT ID
,[BILLED]
,[Payment_Type]
,[BillDate] FROM vw_DelinquentDetail where isdate(billdate) = 1
Оператор select указывает, где появляется следующее сообщение об ошибке.
Преобразование типа данных символа в тип данных даты и времени приводило к значению даты и времени вне диапазона.
Извините за форматирование кода в первом разделе.
Опубликовать Sql, который не работает. – jfar
см. Мое редактирование, у меня есть решение для вас –