Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
又被SQL语句卡住了。错误:“无效的列名”_Sql_Sql Server_Case_Datediff_Dateadd - Fatal编程技术网

又被SQL语句卡住了。错误:“无效的列名”

又被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

我正在尝试使以下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 [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;