让 SQL Server 识别日期列

Rus*_*yan 5 sql-server alias date

我试图在昨天(不是硬编码)的订单表上获取 IDS 的计数,其中表中的日期对应于下订单的时间。

我的桌子看起来像这样

orders (
order_id INT PRIMARY KEY
, user_id INT
, date_created DATE
, order_value FLOAT
, city_id INT
)
Run Code Online (Sandbox Code Playgroud)

我已使用此代码在表中获取今天的日期 -

Select *,DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0) as Today
From orders
Run Code Online (Sandbox Code Playgroud)

这很好用,但是当我尝试尝试下面的 where 子句时

Select *,DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0) as Today
From orders
where Today -1 = date_created;
Run Code Online (Sandbox Code Playgroud)

我收到这个错误“无效的列名‘今天’”所以我的问题只是如何让这个表识别我作为新列添加的日期并允许我对其执行工作?

提前致谢

Dan*_*man 5

我收到此错误“无效的列名‘今天’”

您不能TodayWHERE子句中引用表达式,因为根据查询处理逻辑顺序WHERESELECT子句之前评估子句。

由于您想要的类型是date,因此最好使用CASTorCONVERT而不是DATEADD...DATEDIFF丑陋(在 SQL Server 2008 引入date数据类型之前很常见)。此外,您需要使用DATEADD来计算昨天的日期而不是减法运算符。

下面的示例使用这些技术来获取昨天的订单:

SELECT
      order_id
    , user_id
    , date_created
    , order_value
    , city_id
    , CAST(GETDATE() AS date) as Today
FROM dbo.orders
WHERE DATEADD(day, -1, CAST(GETDATE() AS date)) = date_created;
Run Code Online (Sandbox Code Playgroud)


Eri*_*ing 4

由于查询的逻辑处理方式,您的查询不起作用。

您需要使用公用表表达式:

WITH c
    AS
     (
         SELECT *, DATEADD(dd, DATEDIFF(dd, 0, GETDATE()), 0) AS Today
         FROM   orders
     )
SELECT *
FROM   c
WHERE  c.Today - 1 = date_created;
Run Code Online (Sandbox Code Playgroud)

或者您可以使用派生表。

SELECT *
FROM   (   SELECT *, DATEADD(dd, DATEDIFF(dd, 0, GETDATE()), 0) AS Today
           FROM   orders ) AS c
WHERE  c.Today - 1 = date_created;
Run Code Online (Sandbox Code Playgroud)

两者都不是“更好”。