Создать DateFirst в Select - PullRequest
       45

Создать DateFirst в Select

0 голосов
/ 22 февраля 2019

У меня есть оператор выбора, который требует, чтобы 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 Ответ

0 голосов
/ 25 февраля 2019

Если не доказано иное, вы не можете установить 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 <> скрипка здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...