Solved

Previous month date calculations

Posted on 2013-06-18
6
326 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
PRTG Network Monitor: Intuitive Network Monitoring

Network Monitoring is essential to ensure that computer systems and network devices are running. Use PRTG to monitor LANs, servers, websites, applications and devices, bandwidth, virtual environments, remote systems, IoT, and many more. PRTG is easy to set up & use.

 
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

Optimizing Cloud Backup for Low Bandwidth

With cloud storage prices going down a growing number of SMBs start to use it for backup storage. Unfortunately, business data volume rarely fits the average Internet speed. This article provides an overview of main Internet speed challenges and reveals backup best practices.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

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 …
This article explains how to reset the password of the sa account on a Microsoft SQL Server.  The steps in this article work in SQL 2005, 2008, 2008 R2, 2012, 2014 and 2016.
This Micro Tutorial will give you a basic overview how to record your screen with Microsoft Expression Encoder. This program is still free and open for the public to download. This will be demonstrated using Microsoft Expression Encoder 4.
Learn how to create flexible layouts using relative units in CSS.  New relative units added in CSS3 include vw(viewports width), vh(viewports height), vmin(minimum of viewports height and width), and vmax (maximum of viewports height and width).

910 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

22 Experts available now in Live!

Get 1:1 Help Now