如何汇总给定日期的所有时间值?

时间:2018-12-10 14:03:19

标签: sql-server datetime stored-procedures sum

我在C#中有一个秒表项目。我必须开始记录时间,并将其存储在Timespan列中的数据库中。我还有一个Timestamp列,它记录了记录时间的日期。

现在,我想要一个存储过程(或其他任何东西)来向程序传递一个日期,并且我希望我的程序搜索数据库并在给定日期上汇总每个对应的Timespan列中的所有值。换句话说,如果给它一个日期,我希望我的程序查找每个Timestamp列单元格,并且如果有一个或多个时间戳等于给定的日期,我希望程序继续进行并检查所有相关的时间戳并在“时间跨度”列中进行汇总。

我的代码仅在只有1个时间戳值等于给定日期的情况下有效,并且在有两个或多个时间戳值时对我大吼大叫。这是我的问题。  这是我得到的错误:

  

其他信息:子查询返回了多个值。这是   子查询遵循=,!=,<,<=,>,> =或以下情况时不允许   子查询用作表达式。   我知道以下错误的原因,我只是不知道解决方法

请不要尝试更正我的代码,如果可以的话,建议我一种新方法。 谢谢。

我的总和存储过程:

CREATE PROCEDURE SumOnDateReport
    @QueryDate nvarchar(50)
AS
    DECLARE @total_sec INT
    DECLARE @HourTime INT
    DECLARE @MinTime INT
    DECLARE @SecTime INT

    SET @HourTime = (SELECT CONVERT(INT, SUBSTRING(TimeStringColumn, 1, 2)) 
                     FROM InfoTable 
                     WHERE TimeStampColumn = @QueryDate)
    SET @MinTime = (SELECT CONVERT(INT, SUBSTRING(TimeStringColumn, 3, 2)) 
                    FROM InfoTable 
                    WHERE TimeStampColumn = @QueryDate)
    SET @SecTime = (SELECT CONVERT(INT, SUBSTRING(TimeStringColumn, 5, 2)) 
                    FROM InfoTable 
                    WHERE TimeStampColumn = @QueryDate)

    SET @total_sec = @HourTime * 3600 + @MinTime * 60 + @SecTime

    INSERT INTO InfoTable(TotalSecColumn) VALUES (null)

    UPDATE InfoTable 
    SET TotalSecColumn = @total_sec
    WHERE TimeStampColumn = @QueryDate

    SELECT TotalSecColumn 
    FROM InfoTable
    WHERE TimeStampColumn = @QueryDate

我的桌子:

CREATE TABLE [dbo].[InfoTable] (
    [Id]               INT           IDENTITY (1, 1) NOT NULL,
    [TimeSpanColumn]   NVARCHAR (50) NULL,
    [TimeStampColumn]  DATETIME      NULL,
    [TimeStringColumn] NVARCHAR (50) NULL,
    [TotalSecColumn]   NVARCHAR (50) NULL,
    PRIMARY KEY CLUSTERED ([Id] ASC)
);

1 个答案:

答案 0 :(得分:1)

关闭。整数变量只能接受单个值。要获得单个值,请对每个子选择进行分组和求和:

创建过程SumOnDateReport     @QueryDate nvarchar(50) 如     声明@total_sec INT     宣告@HourTime INT     十进制@MinTime INT     宣告@SecTime INT

SET @HourTime = (SELECT SUM(CONVERT(INT, SUBSTRING(TimeStringColumn, 1, 2))) 
                 FROM InfoTable 
                 WHERE TimeStampColumn = @QueryDate
                 GROUP BY TimeStampColumn) * 3600
SET @MinTime = (SELECT SUM(CONVERT(INT, SUBSTRING(TimeStringColumn, 3, 2))) 
                FROM InfoTable 
                WHERE TimeStampColumn = @QueryDate
                GROUP BY TimeStampColumn) * 60
SET @SecTime = (SELECT SUM(CONVERT(INT, SUBSTRING(TimeStringColumn, 5, 2))) 
                FROM InfoTable 
                WHERE TimeStampColumn = @QueryDate
                GROUP BY TimeStampColumn)
SET @total_sec = @HourTime + @MinTime  + @SecTime

INSERT INTO InfoTable(TotalSecColumn) VALUES (null)

UPDATE InfoTable 
SET TotalSecColumn = @total_sec
WHERE TimeStampColumn = @QueryDate

SELECT TotalSecColumn 
FROM InfoTable
WHERE TimeStampColumn = @QueryDate