Создать DateFirst в Select
У меня есть оператор выбора, который требует, чтобы DateFirst = 1 понедельник в США, поэтому по умолчанию 7 воскресенье
Как я могу изменить это, чтобы встроить DateFirst в оператор выбора, чтобы я мог создать его как представление?
SET DATEFIRST 1;
SELECT
T_APPLICANT.APPL_ID AS empID,
T_APPLICANT.APPL_LASTNAME,
T_APPLICANT.APPL_FIRSTNAME,
T_APPLICANT_ASSIGNMENT.ASS_STARTDATE,
DATEPART(ww, dbo.T_APPLICANT_ASSIGNMENT.ASS_STARTDATE) AS WeekNo,
DATEPART(WEEKDAY, dbo.T_APPLICANT_ASSIGNMENT.ASS_STARTDATE) AS WeekDay,
DATEPART(ww, GETDATE()) AS CurWeekNo,
(T_APPLICANT_ASSIGNMENT.ASS_HOURS) AS Total_Assigned_hrs,
(T_APPLICANT_ASSIGNMENT.ASS_BILL) AS AvgBill_Rate,
(T_APPLICANT_ASSIGNMENT.ASS_PAY) AS AvgPay_Rate,
(T_APPLICANT_ASSIGNMENT.ASS_HOURS * T_APPLICANT_ASSIGNMENT.ASS_PAY) AS Total_AmtPaid,
(T_APPLICANT_ASSIGNMENT.ASS_HOURS * T_APPLICANT_ASSIGNMENT.ASS_BILL) AS Total_AmtBilled,
(LTRIM(STR(DATEPART(yy, T_APPLICANT_ASSIGNMENT.ASS_STARTDATE))) + '-'
+ LTRIM(STR(DATEPART(M, T_APPLICANT_ASSIGNMENT.ASS_STARTDATE)))
) AS YearMo
FROM
T_APPLICANT
RIGHT OUTER JOIN
T_APPLICANT_ASSIGNMENT
ON T_APPLICANT.APPL_ID = T_APPLICANT_ASSIGNMENT.APPL_ID
WHERE
DATEPART(ww, dbo.T_APPLICANT_ASSIGNMENT.ASS_STARTDATE)
BETWEEN DATEPART(ww, GETDATE()) AND DATEPART(ww, GETDATE()) + 1
AND DATEPART(yy, T_APPLICANT_ASSIGNMENT.ASS_STARTDATE) = DATEPART(yy, GETDATE())
AND ASS_STATUS = 'A';
1 ответ
Если не доказано иное, вы не можете установить 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 строк
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
| свидание |:-------- | | 7 | дт | имя дня | будний день | неделя | weekday2 | weekday3:------------------ |:------ | ------: | ---: | -------: | -------: 31/12/2018 00:00:00 | Пн | 2 | 53 | 1 | 1 01.01.2009 00:00:00 | Вт | 3 | 1 | 2 | 2 01.02.2009 00:00:00 | Ср | 4 | 1 | 3 | 3 01.03.2009 00:00:00 | Чт | 5 | 1 | 4 | 4 01.04.2009 00:00:00 | Пт | 6 | 1 | 5 | 5 01.05.2009 00:00:00 | Сб | 7 | 1 | 6 | 6 01.06.2009 00:00:00 | Вс | 1 | 2 | 7 | 7 01.07.2009 00:00:00 | Пн | 2 | 2 | 1 | 1 01.08.2009 00:00:00 | Вт | 3 | 2 | 2 | 2 01.09.2009 00:00:00 | Ср | 4 | 2 | 3 | 3 01.10.2009 00:00:00 | Чт | 5 | 2 | 4 | 4 01.11.2009 00:00:00 | Пт | 6 | 2 | 5 | 5 01.12.2009 00:00:00 | Сб | 7 | 2 | 6 | 6 13/01/2019 00:00:00 | Вс | 1 | 3 | 7 | 7
set datefirst 1; GO
✓
select @@datefirst as [datefirst]; select * from vw_testdatefirst order by dt; GO
| свидание |: -------- | | 1 | дт | имя дня | будний день | неделя | weekday2 | weekday3: ------------------ |: ------ | ------: | ---: | -------: | -------: 31/12/2018 00:00:00 | Пн | 1 | 53 | 1 | 1 01.01.2009 00:00:00 | Вт | 2 | 1 | 2 | 2 02/01/2019 00:00:00 | Ср | 3 | 1 | 3 | 3 01.01.2009 00:00:00 | Чт | 4 | 1 | 4 | 4 01.01.2009 00:00:00 | Пт | 5 | 1 | 5 | 5 05.01.2009 00:00:00 | Сб | 6 | 1 | 6 | 6 01/01/2019 00:00:00 | Вс | 7 | 1 | 7 | 7 01/01/2019 00:00:00 | Пн | 1 | 2 | 1 | 1 01.01.2009 00:00:00 | Вт | 2 | 2 | 2 | 2 01/01/2019 00:00:00 | Ср | 3 | 2 | 3 | 3 01.10.2009 00:00:00 | Чт | 4 | 2 | 4 | 4 01.11.2009 00:00:00 | Пт | 5 | 2 | 5 | 5 01.12.2009 00:00:00 | Сб | 6 | 2 | 6 | 6 13/01/2019 00:00:00 | Вс | 7 | 2 | 7 | 7
дБ<> скрипка здесь