Создать 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

дБ<> скрипка здесь

Другие вопросы по тегам