SQL-clausule voor twee datums precies één maand minus één seconde los van elkaar?

Ik heb twee datetime-kolommen in een tabel en ik zou precies die rijen willen selecteren waarvan het verschil met de eerste kolom tot de tweede kolom één seconde korter is dan een maand. Het zou bijvoorbeeld deze rijen (en geen andere) selecteren voor datums in het jaar 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

Als u echter voor 2012 kiest, moet u het schrikkeljaar afrekenen.

Hoe zou ik zo'n verklaring schrijven?

1

1 antwoord

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)))

Dit zegt: "Laat me rijen zien waar kolom2 is (één maand meer en één seconde minder) dan kolom1."

De ingebouwde datalogica in SQL Server zorgt voor zaken als schrikkeljaren.

3
toegevoegd
+1 Merk op dat de OP misschien wil dat de vergelijking op beide manieren werkt, bijvoorbeeld een verschil in beide richtingen.
toegevoegd de auteur RedFilter, de bron
@RedFilter - goed punt, ik zal dat toevoegen in.
toegevoegd de auteur JNK, de bron