【发布时间】:2019-05-01 06:29:39
【问题描述】:
执行以下查询:
WITH cte AS (
SELECT CAST('" + mindate+ "' as varchar(255)) as fdate
UNION ALL
SELECT CAST(DATEADD(day, 1, fdate) as date)
FROM cte
WHERE fdate < '" + tday+"'
)
SELECT COUNT(fdate) AS Fdate
FROM cte left join tbl_Attendence on cte.fdate = tbl_Attendence.Datess
where tbl_Attendence.Datess is null
但我以以下错误结束:
锚点和列中递归部分的类型不匹配 递归查询“cte”的“fdate”。
【问题讨论】:
-
既然你有明确的演员表,你怎么能混淆?您是说
fdate在 CTE 的第一部分是varchar(255)在递归部分是date。 -
fdate 和 date 都有不同的数据类型,这会导致错误
-
如果您要多次编写此类查询,通常值得投入少量时间来创建日历表。每天填充一行,然后可以轻松地用于这样的查询,20 年的数据仍然少于 10000 行。
-
查询中有很多错误,您只需选择一个字符串 varchar 值 "+ mindate +" 作为 fdate 并使用 CTE 尝试将该 varchar 值转换为日期类型,这在任何语言中都是不可能的.我建议您使用强制转换值进行一个简单的查询,以便您能够理解您在那里做错了什么,或者尝试解释您的要求并为此提供一个场景。
标签: sql sql-server common-table-expression