Как суммировать ** ВСЕ ** значения на данную дату в базе данных SQL Server? - PullRequest
0 голосов
/ 11 ноября 2018

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

Теперь я хочу иметь процедуру сохранения, чтобы назначить программе дату, и я хочу, чтобы моя программа осуществляла поиск в базе данных и суммировала значения ALL в каждом соответствующем столбце «Timespan» на данную дату , Другими словами, если я назначу ей дату, я хочу, чтобы моя программа искала все ячейки столбца «Отметка времени», и если есть одна или несколько отметок времени, равных указанной дате, я хочу, чтобы программа продолжила и проверила все связанные с ними «промежутки времени». столбцы и суммируйте их.

то, что я пробовал: (который работает, если есть только одно значение метки времени, равное данной дате. Выдает ошибку более чем для 1 значения) Это ошибка:

Дополнительная информация: подзапрос вернул более 1 значения. Это не допускается, когда подзапрос следует =,! =, <, <=,>,> = или когда подзапрос используется в качестве выражения.

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, но столбец Time stamp - это datetime.

Ответы [ 2 ]

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

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

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
0 голосов
/ 11 ноября 2018

Так как это столбец 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!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...