Solved

SQL Select end of week date from last year

Posted on 2016-09-12
6
89 Views
Last Modified: 2016-09-12
Hello EE,

if today we are 09/16/2016, I would like to be able from the same day last year to get the Friday of the week

for that example, i woud like to return 09/18/2015
if I chose 09/09/2016   i would need to return 09/11/2015

the user will always chose a date that is a friday.  09/16/2016 is a friday and 09/09/2016 as well.

i need to return the friday's date of last year

can you help me ?
0
Comment
Question by:PhilippeRenaud
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 3
  • 2
6 Comments
 
LVL 43

Expert Comment

by:zephyr_hex (Megan)
ID: 41794464
To get Friday of the current week:  

SELECT DATEADD(wk, DATEDIFF(wk,0,GETDATE()), 4) AS Friday

Open in new window


Just replace GETDATE() with a different date to get the Friday of that week.
0
 
LVL 43

Expert Comment

by:zephyr_hex (Megan)
ID: 41794465
Oh wait, you want last year's Friday... hold on...
0
 
LVL 43

Assisted Solution

by:zephyr_hex (Megan)
zephyr_hex (Megan) earned 250 total points
ID: 41794472
So, to get last year's Friday, you would use DATEADD to get the date from last year, and then figure out the Friday from that date:
SELECT DATEADD(wk, DATEDIFF(wk,0,DATEADD(YEAR,-1,GETDATE())), 4) AS Friday

Open in new window


or, using a date other than today:

SELECT DATEADD(wk, DATEDIFF(wk,0,DATEADD(YEAR,-1,'2016-09-16')), 4) AS Friday

Open in new window

0
Why You Need a DevOps Toolchain

IT needs to deliver services with more agility and velocity. IT must roll out application features and innovations faster to keep up with customer demands, which is where a DevOps toolchain steps in. View the infographic to see why you need a DevOps toolchain.

 
LVL 70

Accepted Solution

by:
Éric Moreau earned 250 total points
ID: 41794476
or something like this which can be embedded in a UDF;
DECLARE @date DATETIME = '2016-09-09'

SET @date = DATEADD(YEAR, -1, @date)

WHILE DATEPART(WEEKDAY, @date) <> 6
	SET @date = DATEADD(DAY, 1, @date)

SELECT @date

Open in new window

0
 
LVL 69

Expert Comment

by:Scott Pletcher
ID: 41794605
Code below will work with any DATEFIRST setting and does not require a loop.  I use a CROSS APPLY just to assign a name to the date calc --  you could instead just repeat the expression in the main code, as the second code block shows.

--more "self-documented" code
SELECT
    user_date_entered,
    /* back up next years max possible date to the last Friday */
    DATEADD(DAY, -(DATEDIFF(DAY, Friday, prev_year_max_date) % 7), prev_year_max_date) AS last_years_Fri_date
FROM (
    VALUES('20160916'),('20160909'),
          ('20160910'),/*test a Saturday input date to verify the code always returns Friday*/
          ('20160911'),/*test a Sunday input date to verify the code always returns Friday*/
          ('20160912')/*test a Monday input date to verify the code always returns Friday*/
) AS test_data(user_date_entered)
CROSS APPLY (
    /*push the date forward 6 days so we can "back up" to Friday*/
    SELECT 4 AS Friday, DATEADD(DAY, +6, DATEADD(YEAR, -1, user_date_entered)) AS prev_year_max_date
) AS assign_alias_names


--minimum amount of code
SELECT
    user_date_entered,
    DATEADD(DAY, -(DATEDIFF(DAY, 4,DATEADD(DAY, +6, DATEADD(YEAR, -1, user_date_entered))) % 7),
        DATEADD(DAY, +6, DATEADD(YEAR, -1, user_date_entered))) AS last_years_Fri_date
FROM (
    VALUES('20160916'),('20160909'),
          ('20160910'),/*test a Saturday input date to verify the code always returns Friday*/
          ('20160911'),/*test a Sunday input date to verify the code always returns Friday*/
          ('20160912')/*test a Monday input date to verify the code always returns Friday*/
) AS test_data(user_date_entered)
0
 
LVL 69

Expert Comment

by:Scott Pletcher
ID: 41794909
Just don't use that code in Europe :-) :

SET LANGUAGE ENGLISH

DECLARE @date DATETIME = '2016-09-09'

SET @date = DATEADD(YEAR, -1, @date)

WHILE DATEPART(WEEKDAY, @date) <> 6
      SET @date = DATEADD(DAY, 1, @date)

SELECT @date


SET LANGUAGE GERMAN

SET @date = DATEADD(YEAR, -1, @date)

WHILE DATEPART(WEEKDAY, @date) <> 6
      SET @date = DATEADD(DAY, 1, @date)

SELECT @date
0

Featured Post

Industry Leaders: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

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

Suggested Solutions

Use this article to create a batch file to backup a Microsoft SQL Server database to a Windows folder.  The folder can be on the local hard drive or on a network share.  This batch file will query the SQL server to get the current date & time and wi…
In this article we will learn how to fix  “Cannot install SQL Server 2014 Service Pack 2: Unable to install windows installer msi file” error ?
Using examples as well as descriptions, and references to Books Online, show the different Recovery Models available in SQL Server and explain, as well as show how full, differential and transaction log backups are performed
Viewers will learn how the fundamental information of how to create a table.

751 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