【问题标题】:How to declare varible to datepart function in stored procedures如何在存储过程中将变量声明为 datepart 函数
【发布时间】:2016-04-11 08:05:54
【问题描述】:

这里我正在尝试创建存储过程.. 按 detepart 分组.. 正确还是错误.??

CREATE PROCEDURE sp_NewvsOldOrders
(
    @StartDate DATETIME,
    @EndDate DATETIME
)
AS BEGIN

    DECLARE @NewCount INT
          , @NewRevenue INT
          , @NewDate DATETIME

    SELECT
         @NewDate = DATEPART(DAY, od.OrderDate)
       , @NewCount = COUNT(*)
       , @NewRevenue = SUM((CONVERT(DECIMAL(18, 2), od.TotalAmount)))
    FROM orderdetails od
    INNER JOIN customer c
        ON od.customerid = c.customerid
    WHERE (CONVERT(DATETIME, (CONVERT(VARCHAR(50), od.orderdate, 101))) BETWEEN @StartDate AND @EndDate)
        AND ((CONVERT(DATETIME, (CONVERT(VARCHAR(50), od.orderdate, 101)))) = (CONVERT(DATETIME, (CONVERT(VARCHAR(50), c.registereddate, 101)))))
        AND (od.TransactionId IS NOT NULL)
        AND (od.TransactionId <> '')
    GROUP BY DATEPART(DAY, od.OrderDate)
           , od.OrderDate

END

【问题讨论】:

  • GROUP BY 上,就像你在 GROUP BY 一样,DATEPART(DAY, od.OrderDate)od.OrderDate 。由于DATEPART(DAY, od.OrderDate)od.OrderDate 的一部分,DATEPART(DAY, od.OrderDate) 是多余的
  • 在查询中,当您GROUP BY 时,结果中可能有不止一行。并且只有一个行结果将分配给变量。
  • DATEPART() 返回一个整数,表示指定日期的指定日期部分。为什么@NewDateDATETIME的数据类型是?应该是integer

标签: sql-server datetime stored-procedures group-by datepart


【解决方案1】:

也许这就是你的存储过程应该的样子。由于您没有解释您的要求,我真的可以说出您想要实现的目标

CREATE PROCEDURE sp_NewvsOldOrders
(
    @StartDate DATETIME,
    @EndDate DATETIME
)
AS BEGIN

    -- not used
    --DECLARE @NewCount INT
    --      , @NewRevenue INT
    --      , @NewDate DATETIME

    SELECT
         NewDate    = DATEPART(DAY, od.OrderDate)
       , NewCount   = COUNT(*)
       , NewRevenue = SUM((CONVERT(DECIMAL(18, 2), od.TotalAmount)))
    FROM orderdetails od
    INNER JOIN customer c
            ON od.customerid = c.customerid
    WHERE (od.orderdate >= StartDate) 
    AND   (od.orderdate <  DATEADD(DAY, 1, @EndDate))
    AND   (CONVERT(VARCHAR(50), od.orderdate, 101) 
         = CONVERT(DATETIME, c.registereddate, 101))
    AND   (od.TransactionId IS NOT NULL)
    AND   (od.TransactionId <> '')
    GROUP BY DATEPART(DAY, od.OrderDate)
           --, od.OrderDate

END

【讨论】:

  • 我想要每天都有新旧订单,所以在声明 @NewCount 的查询中我正在计算 registreddate=Orderdate 是新客户
  • 上述查询返回零值..(0行受影响)
猜你喜欢
  • 1970-01-01
  • 2018-11-27
  • 1970-01-01
  • 2019-07-01
  • 2014-08-08
  • 1970-01-01
  • 2016-07-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多