Подсчет дней в продуктовой жизни, исключая лето - PullRequest
1 голос
/ 28 июня 2019

Я пытаюсь написать SQL-запрос MS для доступа, чтобы вычислить количество дней, прошедших с даты в двухлетних периодах: "лето" (с 1/6 по 30/09) и не лето (с 1/1 по 30/05 и с 1/10 по 31/12).

Эта дата является последней «мерой» продукта, и ей может быть два года.Тогда я хотел бы знать, как и сегодня, сколько дней лета и наоборот, сколько дней не прошло с момента измерения продукта.

т.е.дата 31/10/2017, я хотел бы, чтобы в двух столбцах были показаны летние дни (= 30 дней * 4 месяца в 2018 году + 28 дней в 2019 году = 148 дней) и не летние дни (7 месяцев с 17 ноября по 17 мая + 8 месяцев с 18 января)до 19 мая = 450 дней)

Я пытался использовать циклы IIF наподобие этого: (ANNI - это переменная, которая означает, в каком году мы 0 = этот год, 1 прошлый год и т. д.)

дней не летних

IIF(ANNI=0; "150"; IIF(ANNI=1;   
IIF(G2.DATA_PRODUZ<#01/06/2018#;DateDiff("d",[G2]! 
[DATA_PRODUZ],#01/06/2018#)+90+150;                              
IIF(G2.DATA_PRODUZ>#30/08/18#;DateDiff("d",[G2]! 
[DATA_PRODUZ],#31/12/2018#)+150));"etc");)

Но это не сработает, а сработает только этим летом.Я бы принял любые идеи.

1 Ответ

2 голосов
/ 28 июня 2019

Возможно, не самый эффективный метод, но, безусловно, наиболее читаемый может быть определение функции VBA (в общедоступном модуле), такой как:

Function SummerDays(ByVal dateFrom As Date, ByVal dateTo As Date) As Long
    While dateFrom < dateTo
        If dateFrom >= DateSerial(Year(dateFrom), 6, 1) And dateFrom <= DateSerial(Year(dateFrom), 9, 30) Then
            SummerDays = SummerDays + 1
        End If
        dateFrom = dateFrom + 1
    Wend
End Function

И затем вызвать это из вашего запроса:

SummerDays(G2.DATA_PRODUZ, Date())

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

DateDiff("d",G2.DATA_PRODUZ, Date()) - SummerDays(G2.DATA_PRODUZ, Date())

Чтобы создать общедоступный модуль для определения вышеуказанной функции:

  • Откройте IDE VBA, используя Alt + F11
  • Вставьте новый общедоступный модуль, выбрав Insert > Module или Alt , I , M
  • Скопируйте приведенное выше определение функции в модуль под оператором Option.
  • Сохраните модуль с соответствующим именем.
...