我在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)
);
答案 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