Если не доказано иное, вы не можете установить DATEFIRST
в представлении.
И ни в пользовательской функции.
Таким образом, чтобы иметь представление, которое возвращает номера недели и дня недели, как если бы для параметра DATEFIRST было установлено значение 1?
Это может использовать различные вычисления.
Еще не выяснили, как рассчитать номер недели независимо от значения параметра DATEFIRST, как если бы недели начинались в понедельник.
Это сложно.
Я знаю, можно связатьв таблицу календаря с номерами недель.
Но здесь не цель.
Однако WEEKDAY
также можно рассчитать без использования DATEPART.
Например, путем объединения CASE
с FORMAT
.
Поскольку названия рабочих дней остаются неизменными,независимо от настройки DATEFIRST.
И ISO_WEEK
также начинается в понедельник.
Таким образом, его можно использовать в предложении WHERE для фильтрации по текущей и следующей неделям.
create table testdatefirst (
id int primary key not null identity(1,1),
dt date not null
)
GO
✓
with rcte as
(
select cast('2018-12-24' as date) dt
union all
select dateadd(day, 1, dt)
from rcte
where dt < cast('2019-03-01' as date)
)
insert into testdatefirst (dt)
select *
from rcte
order by dt
GO
68 rows affected
CREATE view vw_testdatefirst AS
select dt
, FORMAT(dt,'ddd','en-GB') as [dayname]
, DATEPART(WEEKDAY, dt) as [weekday]
, DATEPART(WEEK, dt) as [week]
-- , DATEPART(ISO_WEEK, dt) as [ISO_WEEK]
, case FORMAT(dt,'ddd','en-GB')
when 'Mon' then 1
when 'Tue' then 2
when 'Wed' then 3
when 'Thu' then 4
when 'Fri' then 5
when 'Sat' then 6
when 'Sun' then 7
end as [weekday2]
, (((DATEPART(WEEKDAY, dt) + @@DATEFIRST-2)%7)+1) AS [weekday3]
from testdatefirst
where DATEPART(ISO_WEEK, dt) between DATEPART(ISO_WEEK, '2019-01-01') and DATEPART(ISO_WEEK, '2019-01-01')+1
GO
✓
set datefirst 7;
GO
✓
select @@datefirst as [datefirst];
select * from vw_testdatefirst order by dt;
GO
| datefirst |
| :-------- |
| 7 |
dt | dayname | weekday | week | weekday2 | weekday3
:------------------ | :------ | ------: | ---: | -------: | -------:
31/12/2018 00:00:00 | Mon | 2 | 53 | 1 | 1
01/01/2019 00:00:00 | Tue | 3 | 1 | 2 | 2
02/01/2019 00:00:00 | Wed | 4 | 1 | 3 | 3
03/01/2019 00:00:00 | Thu | 5 | 1 | 4 | 4
04/01/2019 00:00:00 | Fri | 6 | 1 | 5 | 5
05/01/2019 00:00:00 | Sat | 7 | 1 | 6 | 6
06/01/2019 00:00:00 | Sun | 1 | 2 | 7 | 7
07/01/2019 00:00:00 | Mon | 2 | 2 | 1 | 1
08/01/2019 00:00:00 | Tue | 3 | 2 | 2 | 2
09/01/2019 00:00:00 | Wed | 4 | 2 | 3 | 3
10/01/2019 00:00:00 | Thu | 5 | 2 | 4 | 4
11/01/2019 00:00:00 | Fri | 6 | 2 | 5 | 5
12/01/2019 00:00:00 | Sat | 7 | 2 | 6 | 6
13/01/2019 00:00:00 | Sun | 1 | 3 | 7 | 7
set datefirst 1;
GO
✓
select @@datefirst as [datefirst];
select * from vw_testdatefirst order by dt;
GO
| datefirst |
| :-------- |
| 1 |
dt | dayname | weekday | week | weekday2 | weekday3
:------------------ | :------ | ------: | ---: | -------: | -------:
31/12/2018 00:00:00 | Mon | 1 | 53 | 1 | 1
01/01/2019 00:00:00 | Tue | 2 | 1 | 2 | 2
02/01/2019 00:00:00 | Wed | 3 | 1 | 3 | 3
03/01/2019 00:00:00 | Thu | 4 | 1 | 4 | 4
04/01/2019 00:00:00 | Fri | 5 | 1 | 5 | 5
05/01/2019 00:00:00 | Sat | 6 | 1 | 6 | 6
06/01/2019 00:00:00 | Sun | 7 | 1 | 7 | 7
07/01/2019 00:00:00 | Mon | 1 | 2 | 1 | 1
08/01/2019 00:00:00 | Tue | 2 | 2 | 2 | 2
09/01/2019 00:00:00 | Wed | 3 | 2 | 3 | 3
10/01/2019 00:00:00 | Thu | 4 | 2 | 4 | 4
11/01/2019 00:00:00 | Fri | 5 | 2 | 5 | 5
12/01/2019 00:00:00 | Sat | 6 | 2 | 6 | 6
13/01/2019 00:00:00 | Sun | 7 | 2 | 7 | 7
db <> скрипка здесь