SQL середина месяца - PullRequest
       3

SQL середина месяца

0 голосов
/ 26 октября 2018

Я знаю, что вы можете установить @Date на 01/01/2001 как начало месяца.

, а затем называйте даты, которые являются первыми каждого месяца, например:

01/01/2001
01/02/2001
01/03/2001

но как бы мне, если возможно, всегда находить дату в середине месяца? Я бы использовал 15-й, но у вас есть проблема с февраля

Мне нужно сделать анализ суммы продаж в середине месяца

любые идеи, пожалуйста, команда

Ответы [ 5 ]

0 голосов
/ 26 октября 2018

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

Set @tdate = '02/10/2018';
Select DATEFROMPARTS(YEAR(@tdate),MONTH(@tdate),1) as startdate , dateadd(day,-1,DATEFROMPARTS(YEAR(@tdate),MONTH(@tdate)+1,1)) as enddate

Привет

0 голосов
/ 26 октября 2018

Предполагая, что вы хотите, чтобы дата была ближе к началу или концу месяца (14 для 28, 15 для 29/30 и 16 для 31-дневных месяцев), просто используйте числовое деление и функцию потолка:

SELECT
    testdate, 
    DAY(EOMONTH(testdate)),
    DATEADD(DAY, CEILING(DAY(EOMONTH(testdate)) / 2.0) - 1, testdate)
FROM (VALUES
    ('2001-02-01'),
    ('2000-02-01'),
    ('2000-04-01'),
    ('2000-03-01')
) AS v(testdate)

Результат:

2001-02-01 | 28 | 2001-02-14
2000-02-01 | 29 | 2000-02-15
2000-04-01 | 30 | 2000-04-15
2000-03-01 | 31 | 2000-03-16
0 голосов
/ 26 октября 2018

Решение:

Получить количество дней в месяце и вычислить «средний» день.В следующем примере количество дней (28, 29, 30 или 31) делится на целочисленный делитель (2), поэтому результатом будет целое число, у которого любая дробная часть будет усечена.Выберите предпочтительный метод.

DECLARE @date date 
SET @date = DATEFROMPARTS(2020, 2, 1)

-- 15 is the half of the month with 30 and 31 days, 14 for months with 28, 29 days
SELECT DATEDIFF(d, @date, DATEADD(month, 1, @date)) / 2
-- 16 is the half of the month with 31 days, 15 for months with 29, 30 days, 14 for month with 28 days
SELECT (DATEDIFF(d, @date, DATEADD(month, 1, @date)) + 1) / 2

Пример:

WITH Months AS
(
    SELECT SomeDate = DATEFROMPARTS(2018, 1, 1)
    UNION ALL
    SELECT DATEADD(month, 1, SomeDate) 
    FROM Months 
    WHERE DATEPART(month, SomeDate) < 12
)
SELECT 
    SomeDate AS FirstDate, 
    DATEADD(d, -1, DATEADD(month, 1, SomeDate)) AS LastDate,
    DATEDIFF(d, SomeDate, DATEADD(month, 1, SomeDate)) AS DaysBetween,
    DATEDIFF(d, SomeDate, DATEADD(month, 1, SomeDate)) / 2 AS HalfOfMonth1,
    (DATEDIFF(d, SomeDate, DATEADD(month, 1, SomeDate)) + 1) / 2 AS HalfOfMonth2
FROM Months

Выход:

FirstDate   LastDate    DaysBetween HalfOfMonth1    HalfOfMonth2
01/01/2018  31/01/2018  31          15              16
01/02/2018  28/02/2018  28          14              14
01/03/2018  31/03/2018  31          15              16
01/04/2018  30/04/2018  30          15              15
01/05/2018  31/05/2018  31          15              16
01/06/2018  30/06/2018  30          15              15
01/07/2018  31/07/2018  31          15              16
01/08/2018  31/08/2018  31          15              16
01/09/2018  30/09/2018  30          15              15
01/10/2018  31/10/2018  31          15              16
01/11/2018  30/11/2018  30          15              15
01/12/2018  31/12/2018  31          15              16
0 голосов
/ 26 октября 2018

Я попробовал следующее

SELECT DATEADD(dd, (datediff(DD, DATEADD(m, DATEDIFF(m, 0, GETDATE()), - 1), eomonth(getdate())) / 2), DATEADD(m, DATEDIFF(m, 0, GETDATE()), - 1)),
    CEILING((datediff(DD, DATEADD(m, DATEDIFF(m, 0, GETDATE()), - 1), eomonth(getdate())) / 2.00))

Обновление ответа

    DECLARE @Date DATE ='2018-10-01'---'20180201'

SELECT DATEADD(DAY, CEILING((DAY(EOMONTH(@Date)) / 2.00)) - 1, @Date) 
0 голосов
/ 26 октября 2018

Вы можете использовать эту формулу

DECLARE @Date DATE ='20180201'

SELECT DATEADD(DAY, (DAY(EOMONTH(@Date)) / 2) - 1, @Date) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...