Solved

SQL Select end of week date from last year

Posted on 2016-09-12
6
65 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
  • 3
  • 2
6 Comments
 
LVL 42

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 42

Expert Comment

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

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
NAS Cloud Backup Strategies

This article explains backup scenarios when using network storage. We review the so-called “3-2-1 strategy” and summarize the methods you can use to send NAS data to the cloud

 
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

Master Your Team's Linux and Cloud Stack!

The average business loses $13.5M per year to ineffective training (per 1,000 employees). Keep ahead of the competition and combine in-person quality with online cost and flexibility by training with Linux Academy.

Question has a verified solution.

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

Why is this different from all of the other step by step guides?  Because I make a living as a DBA and not as a writer and I lived through this experience. Defining the name: When I talk to people they say different names on this subject stuff l…
In this article we will get to know that how can we recover deleted data if it happens accidently. We really can recover deleted rows if we know the time when data is deleted by using the transaction log.
This video shows how to set up a shell script to accept a positional parameter when called, pass that to a SQL script, accept the output from the statement back and then manipulate it in the Shell.
Viewers will learn how to use the SELECT statement in SQL and will be exposed to the many uses the SELECT statement has.

810 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