【发布时间】: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