我想在我的函数中设置DATEFIRST,但不允许这样做。
SET DATEFIRST 1
我可以在SP中添加代码并从函数中调用SP,但我并不热衷于这样做。
我可以在调用我的函数之前设置DATEFIRST,但我也不热衷于这样做。
还有其他工作吗?
修改
以下是我想在我的FUNCTION中使用的代码,用于返回该月的总工作日。但由于我的DATEFIRST
,我无法将此代码添加到FUNCTION中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
答案 0 :(得分:10)
我通常的解决方法是使用“已知良好”日期进行比较。
比如说,我需要检查一个日期是星期六。我不是依赖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的行需要一些工作来生成)
答案 1 :(得分:9)
而不是
SET DATEFIRST 1
你可以做到
SELECT (DATEPART(weekday, GETDATE()) + @@DATEFIRST - 2) % 7 + 1
答案 2 :(得分:0)
如果您需要星期一作为第一天,请关注此代码段
declare @MyDate datetime = getdate()
select CASE WHEN DATEPART(DW,@MyDate) = 1
THEN 7
WHEN DATEPART(DW,@MyDate) <= 7
THEN DATEPART(DW,@MyDate) - 1
END
答案 3 :(得分:0)
另一种方法是显式指定一周的第一天值作为参数,并避免依赖@@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')