如何在给定日期汇总SQL Server数据库中的** ALL **值?

时间:2018-11-11 08:13:57

标签: sql-server date time

我在C#中有一个秒表项目。我将开始记录时间并将其存储在“时间”列中的数据库中。我还有一个“时间戳”列,用于记录时间的记录日期。

现在,我想有一个存储过程来给程序指定一个日期,并且我想让我的程序搜索数据库并在每个对应的“时间跨度”列中汇总 ALL 值给定的日期。换句话说,如果我给它一个日期,我希望我的程序查找每个“ Timestamp”列单元格,如果有一个或多个时间戳等于给定的日期,我希望程序继续进行并检查所有与之相关的“ Timespan” ”列并进行汇总。

我尝试过的方法:(如果只有一个时间戳值等于给定的日期,则可以使用。它会为多个值抛出错误) 这是错误:

  

其他信息:子查询返回了多个值。这是   子查询遵循=,!=,<,<=,>,> =或以下情况时不允许   子查询用作表达式。

CREATE PROCEDURE SumOnDateReport
    @QueryDate DATETIME
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

我所有的表列都是NVARCHAR,但时间stamp列是日期时间。

2 个答案:

答案 0 :(得分:0)

由于它是DATETIME列-您应该避免尝试猜测字符串格式(没有默认的,系统固有的字符串表示形式-因此,代码始终取决于语言/区域设置)-使用适当的DATETIME函数来解决这个问题!

将您的代码(带有SETCONVERT的三个SUBSTRING语句)更改如下:

SELECT 
    @HourTime = SUM(DATEPART(HOUR, TimeStringColumn)),
    @MinTime = SUM(DATEPART(MINUTE, TimeStringColumn)),
    @SecTime = SUM(DATEPART(SECOND, TimeStringColumn))
FROM 
    InfoTable 
WHERE 
    TimeStampColumn = @QueryDate

这对于同一行@QueryDate的多行也应该很好!

答案 1 :(得分:0)

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

CREATE PROCEDURE SumOnDateReport @QueryDate nvarchar(50) AS DECLARE @total_sec INT DECLARE @HourTime INT DECLARE @MinTime INT DECLARE @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