убедитесь, что вы преобразовали дату в дату и время в представлении:
create table testdates
(BILL_MONTH varchar(3)
,BILL_YEAR char(4)
,BILLED char(1)
)
insert into testdates values ('01','2009','y')
insert into testdates values ('02','2009','y')
insert into testdates values ('03','2009','y')
insert into testdates values ('a','bbb','n')
create view testdates_v as
select
CONVERT(datetime,CONVERT(varchar(4), BILL_YEAR) + '-' + CONVERT(varchar(3), BILL_MONTH) + '-1') as billdate
from testdates
WHERE ISDATE(CONVERT(varchar(4), BILL_YEAR) + '-' + CONVERT(varchar(3), BILL_MONTH) + '-1' ) = 1
go
Теперь попробуйте использовать вид:
select billdate from testdates_v
ВЫВОД:
billdate
-----------------------
2009-01-01 00:00:00.000
2009-02-01 00:00:00.000
2009-03-01 00:00:00.000
(3 row(s) affected)
select billdate+1,dateadd(mi,45,billdate) from testdates_v
выход: * +1010 *
----------------------- -----------------------
2009-01-02 00:00:00.000 2009-01-01 00:45:00.000
2009-02-02 00:00:00.000 2009-02-01 00:45:00.000
2009-03-02 00:00:00.000 2009-03-01 00:45:00.000
(3 row(s) affected)
РЕДАКТИРОВАТЬ после редактирования OP, давая больше кода:
SQL SERVER, вероятно, пытается создать столбец billdate
, прежде чем применить WHERE
. В результате измените свое представление, выбрав billdate
, используя CASE
, поэтому оно равно NULL, если недействительная дата:
SELECT ID
,BILLED
,Payment_Type
,CASE
WHEN ISDATE(CONVERT(varchar(4), BILL_YEAR) + '-' + CONVERT(varchar(3), BILL_MONTH) + '-1' ) = 1 THEN CONVERT(datetime, CONVERT(varchar(4), BILL_YEAR) + '-' + CONVERT(varchar(3), BILL_MONTH) + '-1' )
ELSE NULL
END 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')
При использовании приведенного выше представления ошибка исчезает.