코리아인터넷 닷 컴에 나온 것을 약간 정리해보았습니다.

여기서는 sql의 DATEADD()와 DATEDIFF() 두가지 함수로만 구현 해 보자

먼저 해당달에 첫째날을 구하는 함수이다.
      select DATEADD(mm, DATEDIFF(mm,0,getdate()), 0)
      --현재달의 첫째날 구하기



원리는 간단하다.
DATEDIFF()함수는 총 세가지 인자를 갖는데
처음 mm은 달을 나타내고 그다음 0은 '1900-01-01 00:00:00.000'을 의미한다.
마지막 getdate()는 현재 날자와 시간을 리턴하는 함수이다.
그러므로 지금시간에서 1900-01-01 00:00:00.000의 차이를 달의 수로 구하고
다시 DATEADD()함수를 통해 그만큼을 1900-01-01 00:00:00.000에 더해서
나타난 결과가 구하고 싶었던 최종 현재달의 첫째 날짜이다.

좀 어렵다면 몇가지를 응용하면서 알아보자

      select DATEADD(wk, DATEDIFF(wk,0,getdate()), 0)
      --현재주의 월요일 구하기





      select DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)
      --현재해의 첫째날 구하기





      select DATEADD(qq, DATEDIFF(qq,0,getdate()), 0)
      --현재분기의 첫째날 구하기





      select DATEADD(dd, DATEDIFF(dd,0,getdate()), 0)
      --현재날의 자정주의 구하기


그럼 이제 그 전달의 마지막날을 구하고 싶으면 어떨까?
답은 첫째날에서 3 milliseconds만 빼주면 된다.
3 milliseconds인 이유는 SQL Server에서 저장할 수 있는
하루의 마지막 milliseocond가 23:59:59.997이기 때문이다.

그럼 다시 응용해서 몇가지를 더 구현해 보자.


      select dateadd(ms,-3,DATEADD(mm, DATEDIFF(mm,0,getdate()  ), 0))
      --지난달의 마지막날 구하기





      select dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate()  ), 0))
      --지난해의 마지막날 구하기





      select dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate()  )+1, 0))
      --현재달의 마지막날 구하기





      select dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate()  )+1, 0))
      --현재해의 마지막날 구하기



그럼 마지막으로 한번더 응용해서 해당달의 첫째주 월요일을 구해보자


      select DATEADD(wk, DATEDIFF(wk,0,
dateadd(dd,6-datepart(day,getdate()),getdate())), 0)
      --현재달의 첫째주 월요일 구하기


위는 해당달의 6일을 구하고 6일에 해당하는 주의 월요일을 구한것이다.
6일이 아마 첫째주가 포함하는 최대한의 마지막날일 것이다.

물론 또다른 메소드나 각종 어플리케이션에서의 다양한 함수들도
이것보다 더 빠르고 훌륭하게 계산을 해 낼 수 있을 것이다.
여기서는 하나의 방법을 소개한것이므로 유용할때 사용하면 도움이 될것이다.
,