又被SQL语句卡住了。错误:“无效的列名”
我正在尝试使以下SQL server语句正常工作,但出现以下错误:列名“bfg”无效又被SQL语句卡住了。错误:“无效的列名”,sql,sql-server,case,datediff,dateadd,Sql,Sql Server,Case,Datediff,Dateadd,我正在尝试使以下SQL server语句正常工作,但出现以下错误:列名“bfg”无效 WITH valDiff AS ( SELECT CASE WHEN DATEADD(second, 604800, [InTime]) <= [OutTime] THEN [OutTime] ELSE DATEADD(second, 604800, [InTime]) END AS bfg, datediff(second, CASE WHEN [InTim
WITH valDiff AS (
SELECT
CASE
WHEN DATEADD(second, 604800, [InTime]) <= [OutTime] THEN [OutTime]
ELSE DATEADD(second, 604800, [InTime])
END AS bfg,
datediff(second,
CASE
WHEN [InTime] >= @in THEN [InTime]
ELSE @in
END,
CASE
WHEN bfg <= @out THEN bfg
ELSE @out
END)
AS v1 FROM [MyTable]
WHERE
AND [InTime] <= @out
AND bfg >= @in
) SELECT SUM(v1) FROM valDiff;
简而言之,DATEADD的第一个案例应该将'bfg'设置为minOutTime,InTime+7天。第二部分或DATEDIFF应计算InTime字段和上面计算的“bfg”之间的时间差(以秒为单位),如果它们在@in和@out时间范围内
我希望我更了解SQL。。。。。如何修复它?在同一查询中创建别名bfg后,不能使用它。这样做的强烈需求通常意味着需要将代码放入JOIN子句中,以便可以从别名引用它
内连接解
这是个不错的选择。再次加入你的行列
SELECT
T2.bfg,
datediff(second,
CASE WHEN [InTime] >= @in THEN [InTime] ELSE @in END,
CASE WHEN T2.bfg <= @out THEN T2.bfg ELSE @out END)
AS v1
FROM
[MyTable] as T1
inner join
( SELECT MyTableID,
CASE
WHEN DATEADD(second, 604800, [InTime]) <= [OutTime] THEN [OutTime]
ELSE DATEADD(second, 604800, [InTime])
END AS bfg
FROM
[MyTable]
) as T2 on T2.MyTableID = T1.MyTableID
WHERE
[InTime] <= @out
AND T2.bfg >= @in
因此,您的整个代码如下所示:
在同一查询中创建别名bfg后,不能使用它。这样做的强烈需求通常意味着需要将代码放入JOIN子句中,以便可以从别名引用它
内连接解
这是个不错的选择。再次加入你的行列
SELECT
T2.bfg,
datediff(second,
CASE WHEN [InTime] >= @in THEN [InTime] ELSE @in END,
CASE WHEN T2.bfg <= @out THEN T2.bfg ELSE @out END)
AS v1
FROM
[MyTable] as T1
inner join
( SELECT MyTableID,
CASE
WHEN DATEADD(second, 604800, [InTime]) <= [OutTime] THEN [OutTime]
ELSE DATEADD(second, 604800, [InTime])
END AS bfg
FROM
[MyTable]
) as T2 on T2.MyTableID = T1.MyTableID
WHERE
[InTime] <= @out
AND T2.bfg >= @in
因此,您的整个代码如下所示:
但是没有办法把“bfg”的病例检查移出,是吗?我只是想提高效率…哇,谢谢老兄!让我测试一下,然后把它标记为答案。非常感谢。。。。为什么我不知道这样的SQL:另一个有效的选择是创建一个包含BFG值作为列的视图,然后您可以使用此查询从视图中进行选择,而无需任何连接或讨厌的BFG case语句。对不起,但是如何创建视图?我可能错了,但我认为具有内部连接的版本可能最快;但是,它可能与视图相同。这样说,你可以考虑打开另一个问题,关于是否有必要做这些陈述中的90个。也许有更好的办法。幸运的是,没有办法让“bfg”离开这个案子,是吗?我只是想提高效率…哇,谢谢老兄!让我测试一下,然后把它标记为答案。非常感谢。。。。为什么我不知道这样的SQL:另一个有效的选择是创建一个包含BFG值作为列的视图,然后您可以使用此查询从视图中进行选择,而无需任何连接或讨厌的BFG case语句。对不起,但是如何创建视图?我可能错了,但我认为具有内部连接的版本可能最快;但是,它可能与视图相同。这样说,你可以考虑打开另一个问题,关于是否有必要做这些陈述中的90个。也许有更好的办法。祝你好运
WITH valDiff AS (
SELECT
bfg,
datediff(second,
CASE
WHEN [InTime] >= @in THEN [InTime]
ELSE @in
END,
CASE
WHEN bfg <= @out THEN bfg
ELSE @out
END) AS v1
FROM [MyView]
WHERE
[InTime] <= @out
AND bfg >= @in
) SELECT SUM(v1) FROM valDiff;
CASE
WHEN DATEADD(second, 604800, [InTime]) <= [OutTime] THEN [OutTime]
ELSE DATEADD(second, 604800, [InTime])
END
WITH valDiff AS (
SELECT
CASE
WHEN DATEADD(second, 604800, [InTime]) <= [OutTime] THEN [OutTime]
ELSE DATEADD(second, 604800, [InTime])
END AS bfg,
datediff(second,
CASE
WHEN [InTime] >= @in THEN [InTime]
ELSE @in
END,
CASE
WHEN
CASE WHEN DATEADD(second, 604800, [InTime]) <= [OutTime] THEN [OutTime]
ELSE DATEADD(second, 604800, [InTime])
END
<= @out THEN
CASE
WHEN DATEADD(second, 604800, [InTime]) <= [OutTime] THEN [OutTime]
ELSE DATEADD(second, 604800, [InTime])
END
ELSE @out
END)
AS v1 FROM [MyTable]
WHERE
[InTime] <= @out
AND CASE
WHEN DATEADD(second, 604800, [InTime]) <= [OutTime] THEN [OutTime]
ELSE DATEADD(second, 604800, [InTime])
END >= @in
) SELECT SUM(v1) FROM valDiff;