【问题标题】:Create DateFirst in Select在 Select 中创建 DateFirst
【发布时间】:2019-07-16 16:14:55
【问题描述】:

我有一个 Select 语句,要求 DateFirst = 1 Monday 在美国,所以默认是 7 Sunday

如何修改它以将 DateFirst 嵌入到 select 语句中,以便将其创建为视图?

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';

【问题讨论】:

    标签: sql dayofweek


    【解决方案1】:

    除非另有证明,否则您不能在视图中设置 DATEFIRST
    也不是在用户定义的函数中。

    因此,如果 DATEFIRST 设置为 1,则返回星期和工作日数字的视图?
    那可以使用不同的计算。

    尚未弄清楚如何计算周数,而不管 DATEFIRST 设置如何,就好像它从星期一开始一样。
    这是一个棘手的问题。
    我知道,可以链接到带有周数的日历表。
    但这不是这里的目标。

    不过,WEEKDAY 也可以在不使用 DATEPART 的情况下计算。
    例如,将 CASEFORMAT 组合在一起。
    因为工作日的名称保持不变,无论 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 | dt |日名 |工作日 |周 |工作日2 |工作日3 :----------------- | :-------- | ------: | ---: | --------: | --------: 2018 年 12 月 31 日 00:00:00 |星期一 | 2 | 53 | 1 | 1 01/01/2019 00:00:00 |周二 | 3 | 1 | 2 | 2 02/01/2019 00:00:00 |周三 | 4 | 1 | 3 | 3 03/01/2019 00:00:00 |星期四 | 5 | 1 | 4 | 4 04/01/2019 00:00:00 |周五 | 6 | 1 | 5 | 5 05/01/2019 00:00:00 |周六 | 7 | 1 | 6 | 6 06/01/2019 00:00:00 |孙 | 1 | 2 | 7 | 7 2019 年 7 月 1 日 00:00:00 |星期一 | 2 | 2 | 1 | 1 08/01/2019 00:00:00 |周二 | 3 | 2 | 2 | 2 09/01/2019 00:00:00 |周三 | 4 | 2 | 3 | 3 2019 年 10 月 1 日 00:00:00 |星期四 | 5 | 2 | 4 | 4 2019 年 11 月 1 日 00:00:00 |周五 | 6 | 2 | 5 | 5 2019 年 12 月 1 日 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 | dt |日名 |工作日 |周 |工作日2 |工作日3 :----------------- | :-------- | ------: | ---: | --------: | --------: 2018 年 12 月 31 日 00:00:00 |星期一 | 1 | 53 | 1 | 1 01/01/2019 00:00:00 |周二 | 2 | 1 | 2 | 2 02/01/2019 00:00:00 |周三 | 3 | 1 | 3 | 3 03/01/2019 00:00:00 |星期四 | 4 | 1 | 4 | 4 04/01/2019 00:00:00 |周五 | 5 | 1 | 5 | 5 05/01/2019 00:00:00 |周六 | 6 | 1 | 6 | 6 06/01/2019 00:00:00 |孙 | 7 | 1 | 7 | 7 2019 年 7 月 1 日 00:00:00 |星期一 | 1 | 2 | 1 | 1 08/01/2019 00:00:00 |周二 | 2 | 2 | 2 | 2 09/01/2019 00:00:00 |周三 | 3 | 2 | 3 | 3 2019 年 10 月 1 日 00:00:00 |星期四 | 4 | 2 | 4 | 4 2019 年 11 月 1 日 00:00:00 |周五 | 5 | 2 | 5 | 5 2019 年 12 月 1 日 00:00:00 |周六 | 6 | 2 | 6 | 6 13/01/2019 00:00:00 |孙 | 7 | 2 | 7 | 7

    db小提琴here

    【讨论】:

      猜你喜欢
      • 2012-09-11
      • 1970-01-01
      • 2012-04-05
      • 2023-03-11
      • 2016-02-06
      • 2012-08-12
      • 2014-11-05
      • 2017-02-20
      • 1970-01-01
      相关资源
      最近更新 更多