SELECT DATEADD(DAY, -1, dt) FROM (SELECT DATEADD(YEAR, 0, GETDATE()) AS dt) WHERE dt > DATEADD(YEAR, -5, GETDATE()) 这段代码有什么问题,为什么我执行会报错
时间: 2024-01-13 12:04:37 浏览: 70
这段代码的问题在于它没有指定输出的列名。你需要在子查询中给 dt 起一个别名,例如:
```
SELECT DATEADD(DAY, -1, dt) AS previous_date
FROM (SELECT DATEADD(YEAR, 0, GETDATE()) AS dt) AS subquery
WHERE dt > DATEADD(YEAR, -5, GETDATE())
```
这样就能正确地输出结果了。至于为什么会报错,可能是因为你的 SQL 环境对于没有指定列名的查询不允许执行。
相关问题
帮我把这一段代码改成不用with as也能实现同样的功能:WITH cte AS (SELECT DATEADD(YEAR, 0, GETDATE()) AS dt UNION ALL SELECT DATEADD(DAY, -1, dt) FROM cte WHERE dt > DATEADD(YEAR, -5, GETDATE()) -- 相当于推5年前的今天往前推1825天(即5年) ) select CONVERT(VARCHAR(10), dt,120) 工作日期 from cte where datepart(weekday, dt) !=1 -- 排除星期天 order by dt desc option (MAXRECURSION 0); 。请写出代码
可以使用递归函数来代替 with as,以下是修改后的代码:
```
CREATE FUNCTION cte(@dt DATE)
RETURNS TABLE
AS RETURN
(
SELECT DATEADD(YEAR, 0, @dt) AS dt
UNION ALL
SELECT DATEADD(DAY, -1, dt)
FROM cte
WHERE dt > DATEADD(YEAR, -5, @dt)
)
SELECT CONVERT(VARCHAR(10), dt, 120) 工作日期
FROM cte(GETDATE())
WHERE datepart(weekday, dt) != 1
ORDER BY dt DESC
OPTION (MAXRECURSION 0);
```
需要注意的是,递归函数需要设置递归的初始值,这里我们将当前日期作为初始值传入函数中。另外,需要使用 OPTION (MAXRECURSION 0) 来避免递归次数过多导致函数无法执行。
解释一下这段代码 with a as ( SELECT CONVERT(nvarchar(10), getdate() ,120) AS datatime,1 as sortnum union all SELECT CONVERT(nvarchar(10), DATEADD(day, -1, getdate()) ,120) AS datatime,2 as sortnum union all SELECT CONVERT(nvarchar(10), DATEADD(day, -2, getdate()) ,120) AS datatime,3 as sortnum union all SELECT CONVERT(nvarchar(10), DATEADD(day, -3, getdate()) ,120) AS datatime,4 as sortnum union all SELECT CONVERT(nvarchar(10), DATEADD(day, -4, getdate()) ,120) AS datatime,5 as sortnum union all SELECT CONVERT(nvarchar(10), DATEADD(day, -5, getdate()) ,120) AS datatime,6 as sortnum union all SELECT CONVERT(nvarchar(10), DATEADD(day, -6, getdate()) ,120) AS datatime,7 as sortnum ), b as ( select GET_DATE,TAG_VALUE from T_TAG_DATA where TAG_ID = 1408 ) , -- 当日产量 c as ( select a.datatime,ISNULL(sum(b.TAG_VALUE),0) as 当日产量 from a left join b on a.datatime = SUBSTRING(CONVERT(varchar(100), b.GET_DATE, 120),1,10) GROUP BY a.datatime ), -- 台时产量 d as( select a.datatime,b.TAG_VALUE as 台时产量 from a left join b on a.datatime = SUBSTRING(CONVERT(varchar(100), b.GET_DATE, 120),1,10) where SUBSTRING(CONVERT(varchar,GETDATE(),120),12,2) = SUBSTRING(CONVERT(varchar(100), b.GET_DATE, 120),12,2) ), -- 累计产量 e as ( SELECT CONVERT(nvarchar(10), getdate() ,120) AS datatime,sum(TAG_VALUE) as 累计产量 from b where GET_DATE <= getdate() union all SELECT CONVERT(nvarchar(10), DATEADD(day, -1, getdate()) ,120) AS datatime,sum(TAG_VALUE) as 累计产量 from b where GET_DATE <= DATEADD(day, -1, getdate()) union all SELECT CONVERT(nvarchar(10), DATEADD(day, -2, getdate()) ,120) AS datatime,sum(TAG_VALUE) as 累计产量 from b where GET_DATE <= DATEADD(day, -2, getdate()) union all SELECT CONVERT(nvarchar(10), DATEADD(day, -3, getdate()) ,120) AS datatime,sum(TAG_VALUE) as 累计产量 from b where GET_DATE <= DATEADD(day, -3, getdate()) union all SELECT CONVERT(nvarchar(10), DATEADD(day, -4, getdate()) ,120) AS datatime,sum(TAG_VALUE) as 累计产量 from b where GET_DATE <= DATEADD(day, -4, getdate()) union all SELECT CONVERT(nvarchar(10), DATEADD(day, -5, getdate()) ,120) AS datatime,sum(TAG_VALUE) as 累计产量 from b where GET_DATE <= DATEADD(day, -5, getdate()) union all SELECT CONVERT(nvarchar(10), DATEADD(day, -6, getdate()) ,120) AS datatime,sum(TAG_VALUE) as 累计产量 from b where GET_DATE <= DATEADD(day, -6, getdate()) ) select SUBSTRING(a.datatime,6,10) as datatime,ISNULL(c.当日产量,0) as 当日产量,ISNULL(d.台时产量,0) as 台时产量,ISNULL(e.累计产量,0) as 累计产量 from a left join c on a.datatime = c.datatime left join d on a.datatime = d.datatime left join e on a.datatime = e.datatime order by a.datatime asc
这段代码是一个 SQL 查询语句,主要是用于查询某个时间范围内的产量数据。其中,第一部分使用了 with 关键字,创建了一个名为 a 的子查询,生成了过去 7 天的日期和序号;第二部分使用了名为 b 的子查询,查询了一个特定的 TAG_ID 的产量数据;第三部分使用了名为 c 的子查询,查询了每天的产量数据,并计算出每天的当日产量;第四部分使用了名为 d 的子查询,查询了每小时的产量数据,并计算出当天的台时产量;第五部分使用了名为 e 的子查询,查询了过去 7 天的累计产量数据;最后将 a, c, d, e 四个子查询进行 left join 操作,生成了最终的查询结果。
阅读全文