SQL în cazul în care clauza pentru două date exact o lună minus o secundă în afară unul de celălalt?

Am două coloane datetime într-un tabel și aș dori să selectez exact acele rânduri a căror diferență față de prima coloană în cea de-a doua coloană este de o secundă mai mică de o lună. De exemplu, ar fi selectat aceste rânduri (și nu altele) pentru datele din timpul anului 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

Cu toate acestea, selectarea pentru anul 2012, de exemplu, ar trebui să țină cont de anul de salt.

Cum aș scrie o astfel de declarație?

1

1 răspunsuri

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

Acest lucru spune: "Arătați-mi rânduri în cazul în care coloana 2 este (o lună mai mult și o secundă mai puțin) decât col1."

Logica de date încorporată în SQL Server contabilizează automat lucruri precum anii de salt.

3
adăugat
+1 Notă OP poate dori ca compararea să funcționeze în ambele sensuri, de exemplu o diferență în ambele sensuri.
adăugat autor RedFilter, sursa
@RedFilter - punct bun, o să adaug asta în.
adăugat autor JNK, sursa