【问题标题】:how to sum up all time values on a given date?如何总结给定日期的所有时间值?
【发布时间】:2018-12-10 14:03:18
【问题描述】:

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

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

我的代码只有在只有 1 个时间戳值等于给定日期时才有效,如果有两个或更多,它就会对我大喊大叫。这是我的问题。 这是我得到的错误:

附加信息:子查询返回超过 1 个值。这是 当子查询跟随 =、!=、、>= 或当 子查询用作表达式。 我知道以下错误的原因我只是不知道解决方案

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

我的 sum 存储过程:

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)
);

【问题讨论】:

  • 尝试使用 SUM() 包装这些转换,但如果您可以控制整个过程,我建议您从一开始就以秒为单位记录持续时间列。
  • @jdweng - 他的错误与尝试将多行返回到变量中有关
  • 这似乎与C#无关...
  • 这里的解决方案是不使用变量。他们真的不需要。我还建议使用适当的数据类型。数字不应该存储为 varchar,日期作为字符串,你真的需要在每列的名称中添加“列”吗?似乎相当多余。
  • 只写更新语句,不需要变量。您必须使用它们来分解您的灾难性字符串以进行调试。只需将所有这些杂乱无章的子字符串放在您的更新语句中。对我来说,真正的问题不是这个查询,而是这个表的整体架构。

标签: sql-server datetime stored-procedures sum


【解决方案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

【讨论】:

  • 只有一个问题,这段代码中sum 的目的是什么? group bysum 做同样的工作。你是出于某种原因保留它还是我是对的?我删除了 sum 并检查了程序在没有它的情况下运行良好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-09
  • 2012-11-21
  • 1970-01-01
  • 1970-01-01
  • 2015-07-05
  • 1970-01-01
  • 2017-03-17
相关资源
最近更新 更多