Solved

Previous month date calculations

Posted on 2013-06-18
6
325 Views
Last Modified: 2013-06-19
Why following works for Feburary but not for april dates?  When @StarteDate is 4/15/13 and @EndDate is 4/30/13, @LPEndDate returns as '3/30/13' (it should return '3/31/13')? Any ideas?

declare       @NoOfMonths int,
             @LPStartDate datetime,
             @LPEndDate datetime,
             @StartDate datetime = '2/15/13',
             @EndDate datetime = '2/28/13'
             
set @NoOfMonths=DATEDIFF(M,@StartDate,@EndDate)+1

set @LPEndDate=DATEADD(m,-1,@EndDate)
set @LPStartDate =DATEADD(m,@NoOfMonths*-1,@StartDate)
if datepart(d,@LPEndDate) >15 and datepart(d,@LPEndDate) <29
begin
set @LPEndDate=DATEADD(ms,-3,DATEADD(mm,0,DATEADD(mm,DATEDIFF(mm,0,@EndDate),0)))
end
select @LPStartDate, @LPEndDate
0
Comment
Question by:theone1
  • 2
  • 2
  • 2
6 Comments
 
LVL 16

Expert Comment

by:Surendra Nath
ID: 39257417
I already have a solution for you in my blog post here, check it out
http://everysolution.wordpress.com/2011/08/25/how-to-find-the-last-day-of-the-month/
0
 
LVL 16

Accepted Solution

by:
Surendra Nath earned 250 total points
ID: 39257428
the only flaw in your logic over here is.. you are checking if the date is  < 29, if that is corrected then the expected comes out ...

declare       @NoOfMonths int,
             @LPStartDate datetime,
             @LPEndDate datetime,
             @StartDate datetime = '2/15/13',
             @EndDate datetime = '2/28/13'
             
--set @StartDate = '4/15/13'
--set @EndDate = '4/30/13'

set @StartDate = '3/15/13'
set @EndDate = '3/31/13'

set @NoOfMonths=DATEDIFF(M,@StartDate,@EndDate)+1

set @LPEndDate=DATEADD(m,-1,@EndDate)
set @LPStartDate =DATEADD(m,@NoOfMonths*-1,@StartDate)

if datepart(d,@LPEndDate) >15 and datepart(d,@LPEndDate) <=31
begin
set @LPEndDate=DATEADD(ms,-3,DATEADD(mm,0,DATEADD(mm,DATEDIFF(mm,0,@EndDate),0)))
end
select @LPStartDate, @LPEndDate 

Open in new window

0
 

Author Closing Comment

by:theone1
ID: 39257455
Strange when I first had @LPEndDate <=30 it didnt work,,,,, but hey,,,, you are the one to solve it for me,,,, THANK YOU!!!
0
How to run any project with ease

Manage projects of all sizes how you want. Great for personal to-do lists, project milestones, team priorities and launch plans.
- Combine task lists, docs, spreadsheets, and chat in one
- View and edit from mobile/offline
- Cut down on emails

 
LVL 48

Expert Comment

by:PortletPaul
ID: 39258233
my only contribution here will be - why look for the last day of a month?

this is a guess, but what this often stems from is someone using this date arithmetic for use in a date range filter
e.g.
select <<whatever>>
from <<whereever>>
where some_date between {first day of period} and {last day of period}

while this can be workable, often a simpler - AND more reliable method is to avoid using 'between', like so:

select <<whatever>>
from <<whereever>>
where some_date >= {first day of period}
    and some_date <   {first day of next period}

i.e. it's quite easy to get the first day of any month (it's always 1)
and by using <   {first day of next period}
we don't have to concern ourselves with times during the {last day of month}

forgive me if this is utterly irrelevant here - it's a topic of interest to me.
0
 

Author Comment

by:theone1
ID: 39261322
hey P Paul, thank you for explanation.... makes much sense :) you are good teacher sir!
0
 
LVL 48

Expert Comment

by:PortletPaul
ID: 39261369
:) too kind

if you need more on this topic please see: "Beware of Between"
0

Featured Post

What Is Threat Intelligence?

Threat intelligence is often discussed, but rarely understood. Starting with a precise definition, along with clear business goals, is essential.

Join & Write a Comment

Suggested Solutions

I have written a PowerShell script to "walk" the security structure of each SQL instance to find:         Each Login (Windows or SQL)             * Its Server Roles             * Every database to which the login is mapped             * The associated "Database User" for this …
In this article I will describe the Detach & Attach method as one possible migration process and I will add the extra tasks needed for an upgrade when and where is applied so it will cover all.
Sending a Secure fax is easy with eFax Corporate (http://www.enterprise.efax.com). First, Just open a new email message.  In the To field, type your recipient's fax number @efaxsend.com. You can even send a secure international fax — just include t…
This tutorial demonstrates a quick way of adding group price to multiple Magento products.

706 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

15 Experts available now in Live!

Get 1:1 Help Now