Корректировка дат и добавление новых строк - PullRequest
0 голосов
/ 26 февраля 2019

Я пытаюсь вычислить разницу между датами, но для того, чтобы правильно их разделить по месяцам, я надеюсь добавить новые строки вместо того, чтобы иметь столбец для каждого месяца.Мне нужно следующее:

Если месяц начальной даты [ss_strt_dtd] равен месяцу конечной даты [ss_end_dtd], тогда ничего не должно происходить.

Однако, если месяцы отличаютсятогда мне нужно, чтобы начальная дата оставалась неизменной, а конечная дата должна быть первой датой нового месяца.Затем новая дата начала в первом месяце и дата окончания остаются неизменными.

Пример:

January 15, 2018 - January 18, 2018 - Nothing needs to happen
January 28, 2018 - February 2, 2018 would need to be split into two 

строк, которые выглядят так:

[ss_strt_dtd]01/28/2018  [ss_end_dtd]02/01/2018
[ss_strt_dtd]02/01/2018 [ss_end_dtd]02/02/2018

Любые мысли приветствуются!

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

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

Сначала небольшой запрос, который возвращает 10 чисел:

SELECT DISTINCT Abs([id] Mod 10) AS N
FROM MSysObjects;

Сохранить это как Десять .

Затем запрос для возврата серии месяцев в вашем интервале дат:

PARAMETERS 
    [DateStart] DateTime, 
    [DateEnd] DateTime;
SELECT 
    [Ten_0].[N]+[Ten_1].[N]*10+[Ten_2].[N]*100+[Ten_3].[N]*1000+[Ten_4].[N]*10000+[Ten_5].[N]*100000+[Ten_6].[N]*1000000 AS Id, 
    [DateStart] AS DateStart,
    [DateEnd] AS DateEnd, 
    DateAdd("m",[Ten_0].[N]+[Ten_1].[N]*10+[Ten_2].[N]*100+[Ten_3].[N]*1000+[Ten_4].[N]*10000+[Ten_5].[N]*100000+[Ten_6].[N]*1000000,[DateStart]) AS DateMonth
FROM 
    Ten AS Ten_0, 
    Ten AS Ten_1, 
    Ten AS Ten_2, 
    Ten AS Ten_3, 
    Ten AS Ten_4, 
    Ten AS Ten_5, 
    Ten AS Ten_6
WHERE 
    (((DateAdd("m",
        [Ten_0].[N]+[Ten_1].[N]*10+[Ten_2].[N]*100+[Ten_3].[N]*1000+[Ten_4].[N]*10000+[Ten_5].[N]*100000+[Ten_6].[N]*1000000,
        [DateStart]))<=DateAdd("m",
        DateDiff("m", [DateStart],DateAdd("d",-1,[DateEnd])),[DateStart])) 
    AND ((Ten_0.N)<=DateDiff("m",[DateStart],[DateEnd])\1) 
    AND ((Ten_1.N)<=DateDiff("m",[DateStart],[DateEnd])\10) 
    AND ((Ten_2.N)<=DateDiff("m",[DateStart],[DateEnd])\100) 
    AND ((Ten_3.N)<=DateDiff("m",[DateStart],[DateEnd])\1000) 
    AND ((Ten_4.N)<=DateDiff("m",[DateStart],[DateEnd])\10000) 
    AND ((Ten_5.N)<=DateDiff("m",[DateStart],[DateEnd])\100000) 
    AND ((Ten_6.N)<=DateDiff("m",[DateStart],[DateEnd])\1000000));

Сохраните это как MonthsDateRange .

Наконец, вычислите даты С и До для каждого месяца относительно даты начала и окончания:

SELECT 
    MonthsDateRange.Id, 
    MonthsDateRange.DateStart, 
    MonthsDateRange.DateEnd, 
    Year([DateMonth]) AS [Year], 
    Month([DateMonth]) AS [Month], 
    IIf(DateDiff("m",[DateStart],[DateMonth])=0,
        [DateStart],
        DateSerial(Year([DateMonth]),Month([DateMonth]),1)) AS DateFrom, 
    IIf(DateDiff("m",[DateEnd],[DateMonth])=0,
        [DateEnd],
        DateSerial(Year([DateMonth]),Month([DateMonth])+1,1)) AS DateTo, 
    DateDiff("d",[DateFrom],[DateTo]) AS Days
FROM 
    MonthsDateRange;

Сохраните это как DaysMonthsDateRange.

Будет возвращено что-то вроде этого:

Example output

Обратите внимание, что запрос предназначен для возможности возвратамесяцы всего диапазона типа данных Дата .

Это 118800 записей от 100-01-01 до 9999-12-31.

0 голосов
/ 26 февраля 2019

Вы можете использовать UNION:

select ss_strt_dtd, ss_end_dtd from [S&S_Combined]
where year(ss_strt_dtd) = year(ss_end_dtd) and month(ss_strt_dtd) = month(ss_end_dtd)
union all
select ss_strt_dtd, DateSerial(year(ss_end_dtd), month(ss_end_dtd), 1) from [S&S_Combined]
where year(ss_strt_dtd) <> year(ss_end_dtd) or month(ss_strt_dtd) <> month(ss_end_dtd)
UNION ALL select DateSerial(year(ss_end_dtd), month(ss_end_dtd), 1), ss_end_dtd from [S&S_Combined]
where year(ss_strt_dtd) <> year(ss_end_dtd) or month(ss_strt_dtd) <> month(ss_end_dtd);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...