Как суммировать все значения времени на данную дату? - PullRequest
0 голосов
/ 10 декабря 2018

У меня есть проект секундомера в C #.Я должен начать запись времени и сохранить его в своей базе данных в столбце Timespan.У меня также есть столбец Timestamp, в котором записывается дата, когда было записано время.

Теперь я хочу иметь процедуру сохранения (или что-нибудь еще), чтобы передать программе дату, и я хочу, чтобы моя программа искалабазы данных и суммировать ВСЕ значения в каждом соответствующем столбце Timespan на указанную дату.Другими словами, если я назначу ей дату, я хочу, чтобы моя программа искала все Timestamp ячейки столбца, и если есть одна или несколько отметок времени, равных указанной дате, я хочу, чтобы программа продолжила и проверила все связанные с ними «промежутки времени».столбцы и суммируйте их.

Мой код работает, только если есть только 1 значение метки времени, равное данной дате, и кричит на меня, если есть два или более.это моя проблема.Это ошибка, с которой я получаю:

Дополнительная информация: Подзапрос возвратил более 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)
);

1 Ответ

0 голосов
/ 10 декабря 2018

Закрыть.Целочисленная переменная может принимать только одно значение.Чтобы получить одно значение, вы группируете и суммируете для каждого из вложенных элементов:

CREATE PROCEDURE SumOnDateReport @QueryDate nvarchar (50) AS DECLARE @total_sec INT DECLARE @HourTime INT DECLARE @MinTime INT DECLARE @SecT1003 *

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
...