我在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
列是日期时间。
答案 0 :(得分:0)
由于它是DATETIME
列-您应该避免尝试猜测字符串格式(没有默认的,系统固有的字符串表示形式-因此,代码始终取决于语言/区域设置)-使用适当的DATETIME
函数来解决这个问题!
将您的代码(带有SET
和CONVERT
的三个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