【问题标题】:Assigning an input value to a column's value in SQL Server stored procedure在 SQL Server 存储过程中将输入值分配给列的值
【发布时间】:2019-07-22 12:22:18
【问题描述】:

我正在尝试编写一个将日期作为输入的存储过程。

如果传递的日期是18-07-2019,则应从数据库中获取从17-07-2019 06:00 am18-07-2019 06:00 am 的数据。

在下面的存储过程中,我将Reportdatedatetime 数据类型)作为输入。但我无法将它分配给我正在查询的数据库表中包含时间的列(TimestampUTC 列)。

因此,按照以下逻辑,数据会自动显示从昨天到今天“(21-07-2019 到 22-07-2019)”,并且不会根据用户输入的日期而改变。

这里显示部分存储过程:

CREATE PROCEDURE [dbo].[GetElectricityData]
    @Reportdate DATETIME
AS
BEGIN
    SET NOCOUNT ON;    

    WITH t AS
    (
        SELECT a.name, b.Data , a.UnitId, b.TimestampUTC
        FROM [10.87.233.57,1433].[EMMA].[dbo].MeterTags a 
        JOIN [10.87.233.57,1433].[EMMA].[dbo].[DataLog] b ON a.MeterTagId = b.MeterTagId
        WHERE b.MeterTagId IN (388, 184, 196, 194, 197)
        AND TimestampUTC BETWEEN DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE() - 1), 0) + '06:00'
                             AND DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()), 0) + '06:00'
    GROUP BY 
        DATEADD(minute, DATEDIFF(minute, 0, TimestampUTC) / 15 * 15, 0),
        a.name, b.Data, a.UnitId, b.TimestampUTC
 )

任何建议都会非常有帮助。

【问题讨论】:

  • 您可能需要考虑将该参数设为DATE 而不是DATETIME

标签: sql sql-server stored-procedures


【解决方案1】:

GETDATE() 将始终为您提供当前日期,这就是为什么从昨天到今天自动显示数据的原因,而不是尝试如下所示

DATEADD(DAY, DATEDIFF(DAY, 0, CONVERT(datetime, @ReportDate) - 1), 0) + '06:00'
AND
DATEADD(DAY, DATEDIFF(DAY, 0, CONVERT(datetime, @ReportDate)), 0) + '06:00'

【讨论】:

  • 感谢您的指出。替换了 getDate(),它现在可以工作了。
【解决方案2】:

我可以看到您在 WHERE 子句中引用了 GETDATE()(两次)。将它们替换为您的 @Reportdate 变量,如下所示。

    CREATE PROCEDURE [dbo].[GetElectricityData]
        @Reportdate DATETIME
    AS
    BEGIN
        SET NOCOUNT ON;    

        WITH t AS
        (
            SELECT a.name, b.Data , a.UnitId, b.TimestampUTC
            FROM [10.87.233.57,1433].[EMMA].[dbo].MeterTags a 
            JOIN [10.87.233.57,1433].[EMMA].[dbo].[DataLog] b ON a.MeterTagId = b.MeterTagId
            WHERE b.MeterTagId IN (388, 184, 196, 194, 197)
            AND TimestampUTC BETWEEN DATEADD(DAY, DATEDIFF(DAY, 0, @Reportdate - 1), 0) + '06:00'
                                 AND DATEADD(DAY, DATEDIFF(DAY, 0, @Reportdate), 0) + '06:00'
        GROUP BY 
            DATEADD(minute, DATEDIFF(minute, 0, TimestampUTC) / 15 * 15, 0),
            a.name, b.Data, a.UnitId, b.TimestampUTC
     )

【讨论】:

  • 没问题,如果它帮助您使其正常工作,请随时将其标记为正确答案,因为它是您问题的原始答案,其他人在此之后发布,谢谢
  • 已标记。再次感谢:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-18
  • 2015-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多