SQL: сравнение дат только со столбцами месяца и года - PullRequest
4 голосов
/ 08 июня 2011

У меня есть таблица MonthlyShipments, которая выглядит следующим образом:

partnumber | quantity | month | year |
part1      |       12 |     6 | 2011 |
part1      |       22 |     5 | 2011 |
part1      |       32 |     4 | 2011 |
part1      |       42 |     3 | 2011 |
part1      |       52 |     2 | 2011 |

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

where
  MonthlyShipments.Month <> MONTH(GETDATE()) AND 
  CAST(
    (CAST(MonthlyShipments.Month as nvarchar(2)) + 
    '-01-' + 
    CAST(MonthlyShipments.Year as nvarchar(4))) as DateTime)
  > DATEADD(m, -4, GETDATE())

Это работает, но уродливо и оскорбительно.Любой совет, как сделать его красивее?Очень ценю!

Ответы [ 4 ]

5 голосов
/ 08 июня 2011

Не намного лучше ...

DATEDIFF(
    month,
    DATEADD(Year, MonthlyShipments.Year-1900,
        DATEADD(Month, MonthlyShipments.Month-1, 0)
           ),
    GETDATE()
    ) BETWEEN 1 AND 3

однако вложенный DATEADD можно сделать вычисляемым и проиндексированным столбцом

ALTER TABLE MonthlyShipments ADD
    ShipDate AS DATEADD(Year, MonthlyShipments.Year-1900,
            DATEADD(Month, MonthlyShipments.Month-1, 0)
               )

, который дает

WHERE DATEDIFF(month, ShipDate, GETDATE()) BETWEEN 1 AND 3
1 голос
/ 08 июня 2011

Можете ли вы добавить столбец даты? Если вам нужно вычислить дату и вы не хотите, чтобы все стало ужасно, это, вероятно, будет требованием. Даже вычисляемый столбец будет работать ...

Тогда вы можете просто сделать что-то вроде этого:

WHERE datecolumn < DATEADD(month, -3, GETDATE())
0 голосов
/ 09 июня 2011

Если у вас есть индекс (year,month), он будет использовать его, я думаю:

FROM MonthlyShipments ms
WHERE ( ms.year = YEAR(GetDate()) 
        AND ms.month BETWEEN MONTH(GetDate())-3
                         AND MONTH(GetDate())-1
      )
   OR ( ms.year = YEAR(GetDate())-1
        AND ms.month BETWEEN 12 + MONTH(GetDate())-3
                         AND 12 + MONTH(GetDate())-1
      ) 

Хотя выглядит не намного красивее.

0 голосов
/ 08 июня 2011

Вы можете преобразовать свой месяц + дату в date и затем сравнить ее с текущей датой:

WHERE DATEDIFF(m,CONVERT(DATE, [month]+'/01/'+[year],101), GETDATE()) 
BETWEEN 1 AND 3

Или, как говорили другие, вы можете создать новый вычисляемый столбец, содержащий date type

...