I been practicing queries, and my current scenario is to find the nearest Saturday for a given date. After i got the logic down, i came up with a, whats looks like a long and messy query. And I was wondering if there is a way to simplify this. Here's my query
DECLARE @DATE DATE
SET @DATE ='2013-09-13'
IF DATENAME(DW,@DATE) = 'SUNDAY'
BEGIN
SELECT DATEADD(DAY,-1,@DATE) AS DATE, 'IS THE NEAREST SATURDAY'
END
ELSE IF DATENAME(DW,@DATE) = 'MONDAY'
BEGIN
SELECT DATEADD(DAY,-2,@DATE) AS DATE, 'IS THE NEAREST SATURDAY'
END
ELSE IF DATENAME(DW,@DATE) = 'TUESDAY'
BEGIN
SELECT DATEADD(DAY,-3,@DATE) AS DATE, 'IS THE NEAREST SATURDAY'
END
ELSE IF DATENAME(DW,@DATE) = 'WEDNESDAY'
BEGIN
SELECT DATEADD(DAY,3,@DATE) AS DATE, 'IS THE NEAREST SATURDAY'
END
ELSE IF DATENAME(DW,@DATE) = 'THURSDAY'
BEGIN
SELECT DATEADD(DAY,2,@DATE) AS DATE, 'IS THE NEAREST SATURDAY'
END
ELSE IF DATENAME(DW,@DATE) = 'FRIDAY'
BEGIN
SELECT DATEADD(DAY,1,@DATE) AS DATE, 'IS THE NEAREST SATURDAY'
END
ELSE IF DATENAME(DW,@DATE) = 'SATURDAY'
BEGIN
SELECT CONVERT(NVARCHAR,@DATE) + ' IS SATURDAY' AS DATE_DOW
END
As we can see the query is long and runs multiple IFs to look for TRUE condition. Please don't write the query, just hints. I would like to work on the query myself.
Here's my hint without answering, as you requested:
Consider date manipulation, using current date (you can use GETDATE()
or your date variable), DATEADD()
and DATEDIFF()
can be used to write this in a couple lines.
If you just want to simplify your method you could use a CASE
statement:
DECLARE @date DATE = '2013-09-13'
SELECT CASE WHEN DATENAME(DW,@DATE) = 'SUNDAY' THEN CAST(DATEADD(DAY,-3,@DATE) AS VARCHAR(12)) + ' IS THE NEAREST SATURDAY'
WHEN DATENAME(DW,@DATE) = 'MONDAY' THEN CAST(DATEADD(DAY,-2,@DATE) AS VARCHAR(12)) + ' IS THE NEAREST SATURDAY'
WHEN DATENAME(DW,@DATE) = 'TUESDAY' THEN CAST(DATEADD(DAY,-1,@DATE) AS VARCHAR(12)) + ' IS THE NEAREST SATURDAY'
WHEN DATENAME(DW,@DATE) = 'WEDNESDAY' THEN CAST(DATEADD(DAY,1,@DATE) AS VARCHAR(12)) + ' IS THE NEAREST SATURDAY'
WHEN DATENAME(DW,@DATE) = 'THURSDAY' THEN CAST(DATEADD(DAY,2,@DATE) AS VARCHAR(12)) + ' IS THE NEAREST SATURDAY'
WHEN DATENAME(DW,@DATE) = 'FRIDAY' THEN CAST(DATEADD(DAY,3,@DATE) AS VARCHAR(12)) + ' IS THE NEAREST SATURDAY'
ELSE CONVERT(NVARCHAR,@DATE) + ' IS SATURDAY'
END
To clarify on the method I was hinting at and Sparky posted, you need to adjust DATEFIRST
to make this work, it works for whichever day is the first day of the week, Saturday is the 7th day of the week, so:
SET DATEFIRST 7
DECLARE @date DATE = '2013-09-21'
SELECT DATEADD(day,7-DATEPART(weekday,@date),@date)
Try this:
select dateAdd(dd,7-DATEPART(dw,getDate()),GETDATE())
datePart(dw,...) returns day of the week for current date.
7 - that number , returns number of days until Saturday
Add the result to the date to get the next Saturday...
Similar logic if you need to go back to previous Saturday
Sql Fiddle: http://www.sqlfiddle.com/#!3/61998/2
Well not exactly an answer, but an alternative
DECLARE @DATE DATE,
@SUN DATE,
@MON DATE,
@TUE DATE,
@WED DATE,
@THU DATE,
@FRI DATE,
@SAT DATE
SET @DATE = '2013-09-14'
SET @SUN = DATEADD(DAY,-1,@DATE)
SET @MON = DATEADD(DAY,-1,@DATE)
SET @TUE = DATEADD(DAY,-2,@DATE)
SET @WED = DATEADD(DAY,-3,@DATE)
SET @THU = DATEADD(DAY,2,@DATE)
SET @FRI = DATEADD(DAY,1,@DATE)
SET @SAT = DATEADD(DAY,0,@DATE)
SELECT CASE
WHEN DATENAME(DW,@DATE) = 'SUNDAY'
THEN @SUN
WHEN DATENAME(DW,@DATE) = 'MONDAY'
THEN @MON
WHEN DATENAME(DW,@DATE) = 'TUESDAY'
THEN @TUE
WHEN DATENAME(DW,@DATE) = 'WEDNESDAY'
THEN @WED
WHEN DATENAME(DW,@DATE) = 'THURSDAY'
THEN @THU
WHEN DATENAME(DW,@DATE) = 'FRIDAY'
THEN @FRI
ELSE @SAT
END
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.