我对SQL有点生疏了。
我想我可以这样做:
SELECT *, DATEADD(d, 1 ,dStartDateTime) dCloseDate
FROM EventItem
WHERE dCloseDate > '1990-01-01 07:00:00.000'但是当我这样做的时候,我得到了错误:
Invalid column name 'dCloseDate'.有人知道解决这个问题的方法吗?我只是想让我的代码更具可读性和可维护性。
任何关于我为什么不应该这样做的建议也将不胜感激:)
发布于 2011-02-04 11:06:12
您不能在SQL WHERE子句中使用“即时”列名。(可以在ORDER BY子句中使用。)必须对其进行子查询,或重复表达式
SELECT * FROM (
SELECT *, DATEADD(d, 1 ,dStartDateTime) dCloseDate
FROM EventItem
) SUBQ
WHERE dCloseDate > '1990-01-01 07:00:00.000'-或者-
SELECT *, DATEADD(d, 1 ,dStartDateTime) dCloseDate
FROM EventItem
WHERE DATEADD(d, 1 ,dStartDateTime) > '1990-01-01 07:00:00.000'为什么你不应该这么做呢?
话虽如此,您正在对需要表扫描的列扫描执行一个函数。始终在另一端执行函数,以便可以根据dStartDateTime (日期时间列)上的索引测试找到的值。
SELECT *, DATEADD(d, 1 ,dStartDateTime) dCloseDate
FROM EventItem
WHERE dStartDateTime > DATEADD(d, -1 ,'1990-01-01 07:00:00.000')发布于 2011-02-04 11:03:43
不幸的是,您不能使用在AS子句中给出的名称。相反,您必须在WHERE子句中重复该表达式:
SELECT *, DATEADD(d, 1 ,dStartDateTime) AS dCloseDate
FROM EventItem
WHERE DATEADD(d, 1 ,dStartDateTime) > '1990-01-01 07:00:00.000'这不会增加可读性或可维护性。但这是top做到这一点的唯一方法。
发布于 2011-02-04 11:04:59
抱歉,您不能在where子句(或group bys或order bys)中引用列别名(在您的示例中为dCloseDate)。如果您/我们可以,那就太好了,但MS SQL就是不支持。
https://stackoverflow.com/questions/4894133
复制相似问题