I am using MySQL and having issues getting the end of the week date from a DATETIME column, where the end of the week is considered Sunday,
My table looks like this:
Unique_ID | Date |
---|---|
123 | 2020-07-13 17:03:31.035 |
456 | 2021-01-01 15:02:19.029 |
789 | 2020-08-02 18:07:14.011 |
I am needing to get the week for each line where the week ends on Sunday. The time isn't needed. So the end result for 2021-01-01 would show 2021-01-03 since that week ends on Sunday. Does anyone know what function to use for this?
CodePudding user response:
Here's an elaboration (I hope) of Akina's suggestion in the comment:
SELECT *,
dt INTERVAL 6 DAY add6 /*add 6 day ahead*/,
DAYNAME(dt INTERVAL 6 DAY) dn6 /*6 day ahead dayname*/,
dt INTERVAL (6 - wkd) DAY nxtsun /*add 6 day ahead then subtract weekday value from date column*/,
DAYNAME(dt INTERVAL (6 - wkd) DAY) nxtsundn
FROM
(SELECT *,
DATE(date) dt,
DAYNAME(date) dn,
WEEKDAY(date) wkd
FROM mytable) A;
Let's take the second row from your data sample to illustrate what is happening. The base query above:
SELECT *,
DATE(date) dt,
DAYNAME(date) dn,
WEEKDAY(date) wkd
FROM mytable
Will return the following.
Unique_ID | Date | dn | wkd |
---|---|---|---|
456 | 2021-01-01 15:02:19 | Friday | 4 |
Note that the WEEKDAY(date)
(aliased as wkd
in the table) returns 4. Which means it's Friday
. According to the docs, WEEKDAY()
function returns like the following:
0 = Monday
1 = Tuesday
2 = Wednesday
3 = Thursday
4 = Friday
5 = Saturday
6 = Sunday
Adding 6 day interval to the current WEEKDAY()
result goes to the day before next same dayname of the current date
value. So WEEKDAY(2021-01-01)
which is on Friday
, becomes 2021-01-07
which is on Thursday
after being added with 6 day ahead. With a subtraction of the pervious obtained WEEKDAY()
value, the operation becomes DATE INTERVAL (6 - 4) DAY
, which effectively becomes DATE INTERVAL 2 DAY
.