How to get the weekdays date range with MSSQL

I often need to get the Mondays and Fridays for a date. It's actually a fairly easy gymnastic, convert to the week and get the first day of the week or the 4th day of the week.

This operation relies on the Microsoft SQL Server ability to change the first day of the week. The first day of the week can be either a Sunday, a Monday or any other day.

  1. SET datefirst 1

This way, I have set Monday to be the first day of the week. A Friday would be 5, and a Sunday would be 7 [the default for US/English].

Applies to:

Microsoft SQL Server 2000 Microsoft SQL Server 2005 Microsoft SQL Server 2008

Data used

  1. USE sql911;
  2. go
  3. SELECT sales_date,sales_qty,sales_price
  4. FROM sales;
  5. go
sales_date              sales_qty                               sales_price
----------------------- --------------------------------------- ---------------------------------------
2005-10-06 10:01:01.000 10.00                                   11.75
2006-10-06 10:01:01.000 10.00                                   11.75
2005-11-06 10:01:01.000 0.00                                    11.75
2006-10-06 10:01:01.000 10.00                                   11.75
2005-12-06 11:01:01.000 8.00                                    11.75
2006-02-06 13:01:01.000 0.00                                    NULL
2006-03-06 14:01:01.000 5.00                                    11.75
2006-10-06 10:01:01.000 10.00                                   11.75
2006-10-06 10:01:01.000 10.00                                   11.75
2006-04-06 15:01:01.000 4.00                                    11.75
2006-05-06 16:01:01.000 3.00                                    11.75
2004-10-06 10:01:01.000 0.00                                    NULL
2005-11-06 10:01:01.000 9.00                                    11.75
2006-06-06 17:01:01.000 0.00                                    11.75
2006-01-06 12:01:01.000 7.00                                    11.75
2006-02-06 13:01:01.000 6.00                                    11.75
2005-03-06 14:01:01.000 5.00                                    11.75
2006-10-06 10:01:01.000 10.00                                   11.75
2006-10-06 10:01:01.000 3.00                                    11.75
2007-06-06 17:01:01.000 2.00                                    11.75
2007-04-06 00:00:00.000 0.00                                    11.75
2007-05-01 00:00:00.000 5.00                                    11.75
2007-07-06 00:00:00.000 1.00                                    11.75
2007-05-03 09:00:00.000 3.00                                    11.75
2007-05-05 04:00:00.000 1.00                                    11.75
2006-10-06 10:01:01.000 10.00                                   11.75
2004-03-06 14:01:01.000 0.00                                    NULL
2005-04-06 15:01:01.000 4.00                                    11.75
2005-05-06 16:01:01.000 3.00                                    11.75
2006-06-06 17:01:01.000 2.00                                    11.75
2006-07-06 19:01:01.000 1.00                                    11.75
2006-03-06 14:01:01.000 5.00                                    11.75
2006-04-06 15:01:01.000 4.00                                    11.75
2007-05-07 11:00:00.000 2.00                                    11.75
2006-06-06 17:01:01.000 0.00                                    NULL
2006-07-06 19:01:01.000 1.00                                    11.75
2005-10-06 10:01:01.000 10.00                                   11.75
2007-05-08 15:00:00.000 1.50                                    11.75
2005-12-06 11:01:01.000 8.00                                    11.75
2006-01-06 12:01:01.000 7.00                                    11.75
2007-05-07 11:30:00.000 2.00                                    10.50
2007-05-08 13:30:00.000 1.00                                    10.00
2006-07-06 19:01:01.000 1.00                                    11.75
2007-05-09 14:00:00.000 1.25                                    10.00
2007-11-06 10:01:01.000 9.00                                    11.75
2007-05-10 14:00:00.000 5.00                                    10.00
2007-05-11 14:15:00.000 0.00                                    10.00
2007-05-12 15:00:00.000 0.00                                    10.00
2007-05-13 16:00:00.000 1.00                                    10.00
2007-05-08 05:00:00.000 1.00                                    10.00
2007-05-07 00:00:00.000 2.00                                    10.00
2007-05-14 11:00:00.000 3.00                                    10.00
2006-07-06 00:00:00.000 1.00                                    11.75
2007-05-11 13:00:00.000 3.50                                    10.00
2007-05-08 05:00:00.000 0.00                                    10.00
2007-05-08 07:00:00.000 2.00                                    10.00
2007-05-08 11:00:00.000 3.00                                    10.00

(57 row(s) affected)

Getting the Mondays and Fridays

As mentioned earlier, this is only a little bit of gymnastic with the dateadd and datediff.

  1. SELECT sales_date,
  2.        DATENAME(dw, sales_date) AS 'Day of sale',
  3.        DATEADD(wk, DATEDIFF(wk,0,sales_date), 0) AS 'Monday of sale',
  4.        DATENAME(dw,DATEADD(wk, DATEDIFF(wk,0,sales_date), 0)) AS 'Day of the week',
  5.        DATEADD(dd,4,DATEADD(wk, DATEDIFF(wk,0,sales_date), 0)) AS 'Friday of sale',
  6.        DATENAME(weekday,DATEADD(dd,4,DATEADD(wk, DATEDIFF(wk,0,sales_date), 0)))  AS 'Day of the week',
  7.        sales_qty,
  8.        sales_price
  9. FROM sales;
  10. go
sales_date              Monday of sale          Day of the week                Friday of sale          Day of the week                sales_qty                               sales_price
----------------------- ----------------------- ------------------------------ ----------------------- ------------------------------ --------------------------------------- ---------------------------------------
2005-10-06 10:01:01.000 2005-10-03 00:00:00.000 Monday                         2005-10-07 00:00:00.000 Friday                         10.00                                   11.75
2006-10-06 10:01:01.000 2006-10-02 00:00:00.000 Monday                         2006-10-06 00:00:00.000 Friday                         10.00                                   11.75
2005-11-06 10:01:01.000 2005-11-07 00:00:00.000 Monday                         2005-11-11 00:00:00.000 Friday                         0.00                                    11.75
2006-10-06 10:01:01.000 2006-10-02 00:00:00.000 Monday                         2006-10-06 00:00:00.000 Friday                         10.00                                   11.75
2005-12-06 11:01:01.000 2005-12-05 00:00:00.000 Monday                         2005-12-09 00:00:00.000 Friday                         8.00                                    11.75
2006-02-06 13:01:01.000 2006-02-06 00:00:00.000 Monday                         2006-02-10 00:00:00.000 Friday                         0.00                                    NULL
2006-03-06 14:01:01.000 2006-03-06 00:00:00.000 Monday                         2006-03-10 00:00:00.000 Friday                         5.00                                    11.75
2006-10-06 10:01:01.000 2006-10-02 00:00:00.000 Monday                         2006-10-06 00:00:00.000 Friday                         10.00                                   11.75
2006-10-06 10:01:01.000 2006-10-02 00:00:00.000 Monday                         2006-10-06 00:00:00.000 Friday                         10.00                                   11.75
2006-04-06 15:01:01.000 2006-04-03 00:00:00.000 Monday                         2006-04-07 00:00:00.000 Friday                         4.00                                    11.75
2006-05-06 16:01:01.000 2006-05-01 00:00:00.000 Monday                         2006-05-05 00:00:00.000 Friday                         3.00                                    11.75
2004-10-06 10:01:01.000 2004-10-04 00:00:00.000 Monday                         2004-10-08 00:00:00.000 Friday                         0.00                                    NULL
2005-11-06 10:01:01.000 2005-11-07 00:00:00.000 Monday                         2005-11-11 00:00:00.000 Friday                         9.00                                    11.75
2006-06-06 17:01:01.000 2006-06-05 00:00:00.000 Monday                         2006-06-09 00:00:00.000 Friday                         0.00                                    11.75
2006-01-06 12:01:01.000 2006-01-02 00:00:00.000 Monday                         2006-01-06 00:00:00.000 Friday                         7.00                                    11.75
2006-02-06 13:01:01.000 2006-02-06 00:00:00.000 Monday                         2006-02-10 00:00:00.000 Friday                         6.00                                    11.75
2005-03-06 14:01:01.000 2005-03-07 00:00:00.000 Monday                         2005-03-11 00:00:00.000 Friday                         5.00                                    11.75
2006-10-06 10:01:01.000 2006-10-02 00:00:00.000 Monday                         2006-10-06 00:00:00.000 Friday                         10.00                                   11.75
2006-10-06 10:01:01.000 2006-10-02 00:00:00.000 Monday                         2006-10-06 00:00:00.000 Friday                         3.00                                    11.75
2007-06-06 17:01:01.000 2007-06-04 00:00:00.000 Monday                         2007-06-08 00:00:00.000 Friday                         2.00                                    11.75
2007-04-06 00:00:00.000 2007-04-02 00:00:00.000 Monday                         2007-04-06 00:00:00.000 Friday                         0.00                                    11.75
2007-05-01 00:00:00.000 2007-04-30 00:00:00.000 Monday                         2007-05-04 00:00:00.000 Friday                         5.00                                    11.75
2007-07-06 00:00:00.000 2007-07-02 00:00:00.000 Monday                         2007-07-06 00:00:00.000 Friday                         1.00                                    11.75
2007-05-03 09:00:00.000 2007-04-30 00:00:00.000 Monday                         2007-05-04 00:00:00.000 Friday                         3.00                                    11.75
2007-05-05 04:00:00.000 2007-04-30 00:00:00.000 Monday                         2007-05-04 00:00:00.000 Friday                         1.00                                    11.75
2006-10-06 10:01:01.000 2006-10-02 00:00:00.000 Monday                         2006-10-06 00:00:00.000 Friday                         10.00                                   11.75
2004-03-06 14:01:01.000 2004-03-01 00:00:00.000 Monday                         2004-03-05 00:00:00.000 Friday                         0.00                                    NULL
2005-04-06 15:01:01.000 2005-04-04 00:00:00.000 Monday                         2005-04-08 00:00:00.000 Friday                         4.00                                    11.75
2005-05-06 16:01:01.000 2005-05-02 00:00:00.000 Monday                         2005-05-06 00:00:00.000 Friday                         3.00                                    11.75
2006-06-06 17:01:01.000 2006-06-05 00:00:00.000 Monday                         2006-06-09 00:00:00.000 Friday                         2.00                                    11.75
2006-07-06 19:01:01.000 2006-07-03 00:00:00.000 Monday                         2006-07-07 00:00:00.000 Friday                         1.00                                    11.75
2006-03-06 14:01:01.000 2006-03-06 00:00:00.000 Monday                         2006-03-10 00:00:00.000 Friday                         5.00                                    11.75
2006-04-06 15:01:01.000 2006-04-03 00:00:00.000 Monday                         2006-04-07 00:00:00.000 Friday                         4.00                                    11.75
2007-05-07 11:00:00.000 2007-05-07 00:00:00.000 Monday                         2007-05-11 00:00:00.000 Friday                         2.00                                    11.75
2006-06-06 17:01:01.000 2006-06-05 00:00:00.000 Monday                         2006-06-09 00:00:00.000 Friday                         0.00                                    NULL
2006-07-06 19:01:01.000 2006-07-03 00:00:00.000 Monday                         2006-07-07 00:00:00.000 Friday                         1.00                                    11.75
2005-10-06 10:01:01.000 2005-10-03 00:00:00.000 Monday                         2005-10-07 00:00:00.000 Friday                         10.00                                   11.75
2007-05-08 15:00:00.000 2007-05-07 00:00:00.000 Monday                         2007-05-11 00:00:00.000 Friday                         1.50                                    11.75
2005-12-06 11:01:01.000 2005-12-05 00:00:00.000 Monday                         2005-12-09 00:00:00.000 Friday                         8.00                                    11.75
2006-01-06 12:01:01.000 2006-01-02 00:00:00.000 Monday                         2006-01-06 00:00:00.000 Friday                         7.00                                    11.75
2007-05-07 11:30:00.000 2007-05-07 00:00:00.000 Monday                         2007-05-11 00:00:00.000 Friday                         2.00                                    10.50
2007-05-08 13:30:00.000 2007-05-07 00:00:00.000 Monday                         2007-05-11 00:00:00.000 Friday                         1.00                                    10.00
2006-07-06 19:01:01.000 2006-07-03 00:00:00.000 Monday                         2006-07-07 00:00:00.000 Friday                         1.00                                    11.75
2007-05-09 14:00:00.000 2007-05-07 00:00:00.000 Monday                         2007-05-11 00:00:00.000 Friday                         1.25                                    10.00
2007-11-06 10:01:01.000 2007-11-05 00:00:00.000 Monday                         2007-11-09 00:00:00.000 Friday                         9.00                                    11.75
2007-05-10 14:00:00.000 2007-05-07 00:00:00.000 Monday                         2007-05-11 00:00:00.000 Friday                         5.00                                    10.00
2007-05-11 14:15:00.000 2007-05-07 00:00:00.000 Monday                         2007-05-11 00:00:00.000 Friday                         0.00                                    10.00
2007-05-12 15:00:00.000 2007-05-07 00:00:00.000 Monday                         2007-05-11 00:00:00.000 Friday                         0.00                                    10.00
2007-05-13 16:00:00.000 2007-05-14 00:00:00.000 Monday                         2007-05-18 00:00:00.000 Friday                         1.00                                    10.00
2007-05-08 05:00:00.000 2007-05-07 00:00:00.000 Monday                         2007-05-11 00:00:00.000 Friday                         1.00                                    10.00
2007-05-07 00:00:00.000 2007-05-07 00:00:00.000 Monday                         2007-05-11 00:00:00.000 Friday                         2.00                                    10.00
2007-05-14 11:00:00.000 2007-05-14 00:00:00.000 Monday                         2007-05-18 00:00:00.000 Friday                         3.00                                    10.00
2006-07-06 00:00:00.000 2006-07-03 00:00:00.000 Monday                         2006-07-07 00:00:00.000 Friday                         1.00                                    11.75
2007-05-11 13:00:00.000 2007-05-07 00:00:00.000 Monday                         2007-05-11 00:00:00.000 Friday                         3.50                                    10.00
2007-05-08 05:00:00.000 2007-05-07 00:00:00.000 Monday                         2007-05-11 00:00:00.000 Friday                         0.00                                    10.00
2007-05-08 07:00:00.000 2007-05-07 00:00:00.000 Monday                         2007-05-11 00:00:00.000 Friday                         2.00                                    10.00
2007-05-08 11:00:00.000 2007-05-07 00:00:00.000 Monday                         2007-05-11 00:00:00.000 Friday                         3.00                                    10.00

(57 row(s) affected)
  • Line 2: datename(dw, sales_date): extracts the day of the week [dw] out of a date, any date. The day of the week is dependent of the locale defined by the installation of the SQL Server.
  • Line 3: dateadd(wk, datediff(wk,0,sales_date), 0): Takes the sales_date and gets the week with datediff(wk,0,sales_date). Finally, it rewinds to the first day of the week [as defined by: set datefirst 1] which is Monday.

Getting the Mondays and Fridays for this week

  1. SELECT CURRENT_TIMESTAMP AS 'Today',
  2.        DATENAME(dw,CURRENT_TIMESTAMP) AS "Today's day",
  3.        DATEADD(wk, DATEDIFF(wk,0,CURRENT_TIMESTAMP), 0) AS 'Monday this week',
  4.        DATENAME(weekday,DATEADD(wk, DATEDIFF(wk,0,CURRENT_TIMESTAMP), 0)) AS 'Day of the week',
  5.        DATEADD(dd,4,DATEADD(wk, DATEDIFF(wk,0,CURRENT_TIMESTAMP), 0)) AS 'Friday this week',
  6.        DATENAME(weekday,DATEADD(dd,4,DATEADD(wk, DATEDIFF(wk,0,CURRENT_TIMESTAMP), 0))) AS 'Day of the week'
  7. go
Today                   Today's day                    Monday this week        Day of the week                Friday this week        Day of the week
----------------------- ------------------------------ ----------------------- ------------------------------ ----------------------- ------------------------------
2007-10-07 16:49:07.873 Sunday                         2007-10-08 00:00:00.000 Monday                         2007-10-12 00:00:00.000 Friday

(1 row(s) affected)
  • Notice that I did not use the standard getdate() but current_timestamp.
  • getdate() is MSSQL specific.
  • current_timestamp is standard SQL. It's always better practice to use the standard SQL if possible, as Microsoft is trying to be more standard compliant.