Получайте почасовые данные из времени начала

Мне нравится использовать Array.prototype.reduce, потому что это однострочный, и он не полагается на Underscore.js или тому подобное:

$('#formid').serializeArray()
    .reduce(function(a, x) { a[x.name] = x.value; return a; }, {});

Это похоже к ответу с помощью Array.prototype.map, но вам не нужно загромождать область видимости дополнительной переменной объекта. Одноразовые покупки.

ВАЖНОЕ ПРИМЕЧАНИЕ. Формы со вставками, которые имеют повторяющиеся атрибуты name, являются допустимыми HTML и на самом деле являются общим подходом. Использование любого из ответов в этом потоке будет неуместным в этом случае (поскольку объектные ключи должны быть уникальными).

0
задан marc_s 13 July 2018 в 19:40
поделиться

1 ответ

Сложность в том, что вы проверяете часовое окно каждую минуту, поэтому ваш отчет составляет 1440 строк, если он находится на целый день. Вот немного кода, который может это сделать:

SET NOCOUNT ON
-- Create a temporary numbers table to demonstrate its use. 
-- We need numbers up to 24*60-1 (24 hours * 60 minutes -1 for based on zero)

Declare @DailyIntervals int,

SET @DailyIntervals = 24 * 60 - 1
--SELECT @DailyIntervals

-- This calculates the number of recursive inserts needed to reach at least your maximum value
-- NOTE: This is based off of manually inserting your first four values into the table first!

DECLARE @loop int
SET @loop = CEILING(Log(@DailyIntervals,2))-2

Declare @m int
CREATE TABLE ##Nums (i int primary key clustered);

INSERT INTO ##Nums VALUES (1), (2), (3), (4);   -- Seed the table

SET @m = 4

WHILE @loop > 0
BEGIN
    INSERT INTO ##nums SELECT I + @m FROM ##Nums
    SET @m = @@ROWCOUNT * 2 -- max value in table now
    SET @loop = @loop - 1
END

INSERT INTO ##nums Values (0)   -- add the zero value

--SELECT MAX(I) FROM ##Nums

-- Look at July 20th
DECLARE @BeginDt datetime = '2018-07-20'

-- Build a working table of one minute intervals for a full day
WITH hhrs as (
    SELECT Dateadd(MINUTE, i, @BeginDt) as StartTm,
        Dateadd(MINUTE, i+59, @BeginDt) as EndTm
    FROM ##Nums
    WHERE i BETWEEN 0 and @DailyIntervals
    ),

SELECT 
    StartTm,
    EndTm,
    min([Min]) as [Min], 
    max([max]) as [Max]
FROM hhrs h
INNER JOIN MyData m 
    ON m.[Time] Between @StartTm and @EndTm
ORDER BY StartTm

DROP TABLE ##Nums
0
ответ дан Laughing Vergil 17 August 2018 в 12:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: