У меня есть два столбца datetime в таблице, и я хотел бы выбрать именно те строки, чья разница от первого столбца ко второму столбцу составляет одну секунду меньше одного месяца. Например, он будет выбирать эти строки (и не другие) для datetimes в 2011 году:
col1 col2
2011-01-01 00:00:00 2011-01-31 23:59:59
2011-02-01 00:00:00 2011-02-28 23:59:59
2011-03-01 00:00:00 2011-03-31 23:59:59
2011-04-01 00:00:00 2011-04-30 23:59:59
2011-05-01 00:00:00 2011-05-31 23:59:59
2011-06-01 00:00:00 2011-06-30 23:59:59
2011-07-01 00:00:00 2011-07-31 23:59:59
2011-08-01 00:00:00 2011-08-31 23:59:59
2011-09-01 00:00:00 2011-09-30 23:59:59
2011-10-01 00:00:00 2011-10-31 23:59:59
2011-11-01 00:00:00 2011-11-30 23:59:59
2011-12-01 00:00:00 2011-12-31 23:59:59
Однако выбор на 2012 год, например, должен был бы учитывать високосный год.
Как мне написать такое заявление?
SELECT *
FROM Table
WHERE col2 = DATEADD(second, -1, (DATEADD(Month, 1 Col1)))
-- check for either direction
OR col1 = DATEADD(second, -1, (DATEADD(Month, 1 Col2)))
Это говорит: «Покажите мне строки, где column2 (на один месяц больше и на секунду меньше), чем col1».
Встроенная логика даты в SQL Server автоматически учитывает такие вещи, как високосные годы.