我对SQL有点生锈。

我以为我可以做这样的事情:

SELECT *, DATEADD(d, 1 ,dStartDateTime) dCloseDate
FROM EventItem
WHERE dCloseDate > '1990-01-01 07:00:00.000'


但是当我这样做时,我得到了错误:

Invalid column name 'dCloseDate'.


有人知道解决方法吗?我只是想这样做,以使我的代码更具可读性/可维护性。

关于为什么我不应该这样做的任何建议也将不胜感激:)

最佳答案

您不能在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列执行一项需要进行表扫描的功能。始终在另一侧执行功能,以便可以对照dStartDateTime(datetime列)上的索引测试找到的值。

SELECT *, DATEADD(d, 1 ,dStartDateTime) dCloseDate
FROM EventItem
WHERE dStartDateTime > DATEADD(d, -1 ,'1990-01-01 07:00:00.000')

10-06 10:11