我有一个简单的表格,其中日期列answer_6
(格式为varchar(max)
要么具有有效日期或字符串Now
。我想用Now
代替select
CASE [answer_6]
WHEN 'Now' THEN CONVERT(varchar, GETDATE())
ELSE answer_6
END as x,
answer_6 from [tDataMult] where DATEDIFF(yy, GETDATE(), [x]) > 5
当前的日期/时间,然后计算差异。这是我做的:
invalid column name 'x'
系统会给我DateDiff
。如果我删除SELECT
{{1}}语句就可以了。
答案 0 :(得分:1)
您不能在同一级别的WHERE
子句中使用别名,因为WHERE
子句在 SELECT
子句之前被评估为。请尝试以下方法:
SELECT t.* FROM (<...>) t WHERE DATEDIFF(yy, GETDATE(), [t.x]) > 5
相反<...>
将您的查询设为WHERE
子句。
答案 1 :(得分:1)
您无法引用您在WHERE
子句中创建的别名。修复它的最简单方法就是将原始查询转换为子查询:
SELECT *
FROM
(
select
CASE [answer_6]
WHEN 'Now' THEN CONVERT(varchar, GETDATE())
ELSE answer_6
END as x,
answer_6 from [tDataMult]
) AS qry
WHERE DATEDIFF(yy, GETDATE(), [x]) > 5
或者您可以复制WHERE
子句中的表达式:
select
CASE [answer_6]
WHEN 'Now' THEN CONVERT(varchar, GETDATE())
ELSE answer_6
END as x,
answer_6 from [tDataMult]
WHERE DATEDIFF(yy, GETDATE(),
(CASE [answer_6]
WHEN 'Now' THEN CONVERT(varchar, GETDATE())
ELSE answer_6
END)
) > 5
答案 2 :(得分:0)
TDataMult表中不存在列X,因为它是别名。 在DateDiff函数中将其替换为answer_6。
然而,answer_6列的一个可能值是varchar格式(&#39;现在&#39;)。 您需要具有有效的数据格式才能正确使用DATEDIFF功能。 (例如:&#39; yyyy-mm-dd&#39;)。