SET DATEFIRST IN功能(SET DATEFIRST in FUNCTION)

2019-07-31 16:52发布

我想设置DATEFIRST在我的功能,但它是不允许的。

SET DATEFIRST 1

我可以在SP中添加代码,并调用从功能的SP,但我并不热衷于这样做。

我可以设置DATEFIRST之前,我打电话给我的功能,但我并不热衷于这样做,也是如此。

任何其他解决办法?

编辑

下面是我想在我的函数用来返回月份的总工作日的代码。 但我不能添加此代码到功能,因为我DATEFIRST的

DECLARE @my int
DECLARE @myDeduct int
DECLARE @day INT
DECLARE @mydate DATETIME
DECLARE @TotalDays INT

SET @mydate = GETDATE()

SET @myDeduct = 0
IF (@@DATEFIRST + DATEPART(DW, @mydate)) % 7 not in (0,1)
SET DateFirst 1 -- Set it monday=1 (value)

--Saturday and Sunday on the first and last day of a month will Deduct 1
IF (DATEPART(weekday,(DATEADD(dd,-(DAY(@mydate)-1),@mydate))) > 5)
SET @myDeduct = @myDeduct + 1

IF (DATEPART(weekday,(DATEADD(dd,-(DAY(DATEADD(mm,1,@mydate))),DATEADD(mm,1,@mydate)))) > 5)
SET @myDeduct = @myDeduct + 1

SET @my = day(DATEADD(dd,-(DAY(DATEADD(mm,1,@mydate))),DATEADD(mm,1,@mydate)))

Set @TotalDays = (select (((@my/7) * 5 + (@my%7)) - @myDeduct))

Select @TotalDays

Answer 1:

我通常的解决方法是用我比较“已知良好”的日期。

说,例如,我需要检查的日期是星期六。 而不是依靠DATEFIRST或语言设置(使用DATENAME ),我反而说:

DATEPART(weekday,DateToCheck) = DATEPART(weekday,'20120714')

我知道,2012年7月14日是星期六,所以我不依靠任何外部设置进行检查。


表达式(DATEPART(weekday,DateToCheck) + @@DATEFIRST) % 7总是会产生值0为星期六,1为星期日,2为星期一,等等

所以,我建议你创建一个表:

CREATE TABLE WorkingDays (
    NormalisedDay int not null,
    DaysInMonth int not null,
    WorkingDays int not null
)

填充此表是一次性的锻炼。 NormalisedDay将是我上式计算的值。

为了计算DaysInMonth给出一个特定日期,可以使用表达式:

DATEDIFF(day,
      DATEADD(month,DATEDIFF(month,0,DateToCheck),0),
      DATEADD(month,DATEDIFF(month,'20010101',DateToCheck),'20010201'))

现在,所有的功能所要做的就是在表中查找的数值。

(当然,这里的所有行的DaysInMonth 28将有20作为自己的结果。这是只为29,30和31这需要一点点的工作产生行)



Answer 2:

代替

SET DATEFIRST 1

你可以做

SELECT (DATEPART(weekday, GETDATE()) + @@DATEFIRST - 2) % 7 + 1


Answer 3:

如果您需要周一firstday遵循此代码段

declare @MyDate datetime = getdate()
                   select CASE WHEN DATEPART(DW,@MyDate) = 1   
                            THEN 7 
                          WHEN DATEPART(DW,@MyDate) <= 7 
                            THEN DATEPART(DW,@MyDate) - 1                            
                     END 


Answer 4:

另一种方法是显式地指定星期值作为参数的第一天,避免因@@DATEFIRST设置。 你可以用下面的公式来实现,在你的函数:

(DATEPART(dw, GETDATE()) + @@DATEFIRST + 6 - @WeekStartDay) % 7 + 1

其中@WeekStartDay是你想为你的系统的一周的第一天(从1到7,这意味着从周一至周日)。

我已经把它包到下面的功能,所以我们可以很容易地重用:

CREATE FUNCTION [dbo].[GetDayInWeek](@InputDateTime DATETIME, @WeekStartDay INT)
RETURNS INT
AS
BEGIN
    --Note: @WeekStartDay is number from [1 - 7] which is from Monday to Sunday
    RETURN (DATEPART(dw, @InputDateTime) + @@DATEFIRST + 6 - @WeekStartDay) % 7 + 1 
END

实例: GetDayInWeek('2019-02-04 00:00:00', 1)

它等效于以下(但独立于DATEFIRST设置):

SET DATEFIRST 1
DATEPART(dw, '2019-02-04 00:00:00')


文章来源: SET DATEFIRST in FUNCTION