Функция даты SQL - PullRequest
       10

Функция даты SQL

2 голосов
/ 14 июля 2011

Возможно, я использую неправильный термин (поэтому я не могу найти его в Google).

"Существуют ли какие-либо функции или общий код для сокращения учетных месяцев?"

ДляНапример, этот месяц начался в пятницу, но в большинстве бухгалтерских журналов недели измеряются первым понедельником месяца, поэтому вместо 1-го июля это будет 4-е июля.То же самое с концом месяца (29-го вместо 31-го)

Опять же, я уверен, что кто-то создал это «колесо» раньше, и я не могу найти его для своей жизни.

Ответы [ 2 ]

1 голос
/ 15 июля 2011

В следующем запросе предполагается, что в таблице SalesTable есть поле с именем Amount (значение, которое вы хотите суммировать) и поле с именем SaleDate (дата, когда произошла продажа). Также предполагается, что учетные месяцы начинаются в первый понедельник. месяца и заканчивается в воскресенье до начала следующего отчетного месяца.

Опять же, я настоятельно рекомендую к этому подход на основе таблиц, но если вы не можете изменить схему, это должно сработать в T-SQL:

SELECT 
    CASE WHEN s.SaleDate < DATEADD(WEEK, DATEDIFF(WEEK, 0, DATEADD(DAY, 6 - DATEPART(DAY, s.SaleDate ),s.SaleDate )), 0)
       THEN DATEADD(WEEK, DATEDIFF(WEEK, 0, DATEADD(DAY, 6 - DATEPART(DAY, DATEADD(day,-7,s.SaleDate) ),DATEADD(day,-7,s.SaleDate) )), 0)
       ELSE DATEADD(WEEK, DATEDIFF(WEEK, 0, DATEADD(DAY, 6 - DATEPART(DAY, s.SaleDate ),s.SaleDate )), 0) 
    END AccountingMonth,

 SUM(s.Amount) TotalSales

FROM SalesTable s

GROUP BY 
    CASE WHEN s.SaleDate < DATEADD(WEEK, DATEDIFF(WEEK, 0, DATEADD(DAY, 6 - DATEPART(DAY, s.SaleDate ),s.SaleDate )), 0)
       THEN DATEADD(WEEK, DATEDIFF(WEEK, 0, DATEADD(DAY, 6 - DATEPART(DAY, DATEADD(day,-7,s.SaleDate) ),DATEADD(day,-7,s.SaleDate) )), 0)
       ELSE DATEADD(WEEK, DATEDIFF(WEEK, 0, DATEADD(DAY, 6 - DATEPART(DAY, s.SaleDate ),s.SaleDate )), 0) 
    END

Обратите внимание, что поле возврата AccountingMonth фактически содержит дату первого понедельника месяца. На практике вы, вероятно, захотите обернуть весь этот запрос в другой запрос, который переформатирует AccountingMonth во что угодно: «2011-07», «2011-08» и т. Д.

Вот как это работает: этот фрагмент кода является важной частью:

DATEADD(WEEK, DATEDIFF(WEEK, 0, DATEADD(DAY, 6 - DATEPART(DAY, s.SaleDate ),s.SaleDate )), 0)

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

Удачи!

-Michael

0 голосов
/ 15 июля 2011

У меня есть код, который принимает год и месяц и возвращает даты начала и окончания финансового года.Возможно, это даст вам возможность пройти мимо:

DECLARE @yr int;
DECLARE @mo int;
SELECT @yr = 2011
SELECT @mo = 7

DECLARE @FiscalMonthStartDate datetime
DECLARE @FiscalMonthEndDate datetime

DECLARE @startOfMonth datetime
DECLARE @startOfNextMonth datetime

select @startOfMonth = CAST((CAST(@yr AS VARCHAR(4)) + '-' + CAST(@mo AS VARCHAR(2)) + '-' + '01') as DATE)
select @startOfNextMonth = CAST((CAST(@yr AS VARCHAR(4)) + '-' + CAST((@mo + 1) AS VARCHAR(2)) + '-' + '01') as DATE)

SELECT @FiscalMonthStartDate =
        CASE 
            WHEN DATEPART(DW,@startOfMonth) = 0
                THEN DATEADD(DD, 1, @startOfMonth)
            ELSE
                DATEADD(DD, 8 - DATEPART(DW,@startOfMonth), @startOfMonth)
        END

SELECT @FiscalMonthEndDate =
        CASE 
            WHEN DATEPART(DW,@startOfNextMonth) = 0
                THEN DATEADD(DD, 1, @startOfNextMonth)
            ELSE
                DATEADD(DD, 8 - DATEPART(DW,@startOfNextMonth), @startOfNextMonth)
        END

-- subtract one day to get end of fiscal month (not start of next fiscal month)
SELECT @FiscalMonthEndDate = DATEADD(DD, -1, @FiscalMonthEndDate)

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