Хранимая процедура, чтобы принять дату начала и количество последовательных дат, начинающихся с даты начала

Еще одна опция:

var someArray = [...];

function generateSortFn(prop, reverse) {
    return function (a, b) {
        if (a[prop] < b[prop]) return reverse ? 1 : -1;
        if (a[prop] > b[prop]) return reverse ? -1 : 1;
        return 0;
    };
}

someArray.sort(generateSortFn('name', true));

сортирует по возрастанию по умолчанию.

2
задан marc_s 13 July 2018 в 20:56
поделиться

2 ответа

Используйте таблицу подсчета очков ... она будет намного быстрее. Проверьте его на 10K дней ... и запустите код цикла в течение 10K дней.

declare @dateparameter date = '1900-04-12'
declare @numOfDays int = 10000

;WITH
    E1(N) AS (select 1 from (values (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))dt(n)),
    E2(N) AS (SELECT 1 FROM E1 a, E1 b), --10E+2 or 100 rows
    E4(N) AS (SELECT 1 FROM E2 a, E2 b), --10E+4 or 10,000 rows max
    cteTally(N) AS 
    (
        SELECT  ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E4
    )

select 
    datevalue = @dateparameter
    ,year = datepart(year,@dateparameter)
    ,quarter = datepart(quarter,@dateparameter)
    ,month = datepart(month,@dateparameter)
    ,dayofweek = datepart(weekday,@dateparameter)
union all
select 
    datevalue = dateadd(day,N,@dateparameter)
    ,year = datepart(year,dateadd(day,N,@dateparameter))
    ,quarter = datepart(quarter,dateadd(day,N,@dateparameter))
    ,month = datepart(month,dateadd(day,N,@dateparameter))
    ,dayofweek = datepart(weekday,dateadd(day,N,@dateparameter))
from cteTally
where N <= @numOfDays

Но, если вы собираетесь часто ссылаться на него, почему бы не сделать упорную таблицу? Аарон Бертран имеет отличную статью об этом: https://www.mssqltips.com/sqlservertip/4054/creating-a-date-dimension-or-calendar-table-in-sql-server/

1
ответ дан scsimon 17 August 2018 в 12:10
поделиться

Вы используете одно и то же значение для @StartDate каждый раз, когда вы перебираете цикл.

Предполагая, что вам нужны части даты каждой даты в вашем примере вывода, в конце цикла вы должны обновите значение @StartDate.

INSERT INTO @DateList
VALUES(@Counter + 1, DATEADD(day,@Counter, @StartDate), DATEPART(year, @StartDate), DATEPART(QUARTER, @StartDate),DATEPART(month, @StartDate), DatePart(WEEKDAY,@StartDate)) ;
SET @StartDate = DATEADD(day,@Counter + 1, @StartDate);
SET @Counter +=1;
1
ответ дан squillman 17 August 2018 в 12:10
поделиться
Другие вопросы по тегам:

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