• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 135
  • Last Modified:

SQL Select end of week date from last year

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
PhilippeRenaud
Asked:
PhilippeRenaud
  • 3
  • 2
2 Solutions
 
zephyr_hex (Megan)DeveloperCommented:
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
 
zephyr_hex (Megan)DeveloperCommented:
Oh wait, you want last year's Friday... hold on...
0
 
zephyr_hex (Megan)DeveloperCommented:
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
Learn to develop an Android App

Want to increase your earning potential in 2018? Pad your resume with app building experience. Learn how with this hands-on course.

 
Éric MoreauSenior .Net ConsultantCommented:
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
 
Scott PletcherSenior DBACommented:
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
 
Scott PletcherSenior DBACommented:
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

The 14th Annual Expert Award Winners

The results are in! Meet the top members of our 2017 Expert Awards. Congratulations to all who qualified!

  • 3
  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now