【问题标题】:How to make a datepart() function in a view accept Monday as the first day of the week如何使视图中的 datepart() 函数接受星期一作为一周的第一天
【发布时间】:2016-10-03 16:07:58
【问题描述】:

对于一个 web 应用程序,我创建了以下视图:

alter view [dbo].[vwBookingData] 
as
    select concat(rtrim(ltrim(str(datepart(year, bookingdata.booking_datetime)))), '-', rtrim(ltrim(str(datepart(week, bookingdata.booking_datetime))))) as  WeekNumber, 
           bookingdata.booking_customerCode as ClientCode, customer.Name as ClientName, concat(bookingdata.booking_provider, concat('-', bookingdata.booking_system)) as ProviderCombo,
           bookingdata.segments_carrierCode as CarrierCode, bookingdata.booking_datetime as BookingDate, bookingdata.booking_bookingId, flgConfirmed, flgFailed
    from dbo.flights_bookingdata bookingdata
         inner join dbo.Customer on Customer.Number = bookingdata.booking_customerCode

我的问题是所用查询的 1 个特定部分:

datepart(week, bookingdata.booking_datetime)

我注意到 datepart() 似乎需要一周的时间从星期日而不是星期一开始,这破坏了视图应该生成的概述。

有没有办法可以在查询本身中解决这个问题?

【问题讨论】:

  • 阅读DATEPART (Transact-SQL),尤其是week and weekday datepart Arguments部分。
  • 我在问我的问题之前做过。但是我怎么能确定 DATEFIRST 总是有正确的价值呢? µ
  • 对于希望与服务器默认开始日期不同的每个查询,您必须在顶部 set datefirst 1;

标签: sql sql-server sql-server-2008 azure-sql-database


【解决方案1】:

也许你可以试试(我是第一个正确的 1 而不是 2)

SET DATEFIRST 1;

在查询的顶部

SET DATEFIRST 7;  -- The Default
Select *
      ,WeedDay=DateName(DW,RetVal)
      ,WeekNo=DatePart(WK,RetVal) 
 From [dbo].[udf-Range-Date]('2016-10-01','2016-10-14','DD',1)

虽然

SET DATEFIRST 1;
Select *
      ,WeedDay=DateName(DW,RetVal)
      ,WeekNo=DatePart(WK,RetVal) 
 From [dbo].[udf-Range-Date]('2016-10-01','2016-10-14','DD',1)

【讨论】:

  • 我想你的意思是 2,因为 1 是星期日。
  • 是的,但它在视图中。我怎么能确定它总是假定星期一是一周的第一天?
  • 你确定它是 2,而不是?
  • 参数编号 | @number_var 是一个整数,表示一周的第一天。它可以是以下值之一。值 一周的第一天是 1 星期一 2 星期二 3 星期三 4 星期四 5 星期五 6 星期六 7 (默认,美国英语)星期日
  • @JiggsJedi 不,我是正确的 1。只是为了好玩,请参阅带有插图的更新答案
【解决方案2】:

看到您不能使用SET DATEFIRST 选项,我会在您调用DATEPART 函数时从日期时间中减去一天,如下所示:

DATEPART(WEEK, DATEADD(DAY, -1, bookingdata.booking_datetime))

【讨论】:

    【解决方案3】:

    使用此函数,您可以从星期一开始以任何服务器语言或 DATEFIRST 设置返回星期几:

    -- =============================================
    -- Author:      Javier Cañon
    -- Create date: 2019-04-23
    -- Description: Return day of week without know of server SET DATEFIRST setting
    -- =============================================
    CREATE FUNCTION [dbo].[fnGetWeekDayFromMonday]
    (
        -- Add the parameters for the function here
        @SomeDate DATE
    )
    RETURNS int
    AS
    BEGIN
    
    DECLARE @SqlWeekDay INT, @ResultVar int;
    
        SET  @SqlWeekDay= DATEPART(dw, @SomeDate);
        SET @ResultVar = ((@SqlWeekDay + @@DATEFIRST - 1 - 1) % 7) + 1;
    
        -- Return the result of the function
        RETURN @ResultVar;
    
    END
    GO
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-31
      • 2013-06-05
      • 1970-01-01
      • 1970-01-01
      • 2016-07-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多