微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

sql-server – 在功能中设置DATEFIRST

我想在我的函数中设置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,-(DAY(DATEADD(mm,1,@mydate))),DATEADD(mm,@mydate)))) > 5)
SET @myDeduct = @myDeduct + 1

SET @my = day(DATEADD(dd,@mydate)))

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

Select @TotalDays

解决方法

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

比如说,我需要检查一个日期是星期六.我不是依赖于DATEFirsT或语言设置(用于使用DATENAME),而是说:

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

我知道2012年7月14日是星期六,所以我在没有依赖任何外部设置的情况下执行了检查.

表达式(DATEPART(工作日,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,Datetocheck),0),'20010101','20010201'))

现在您的所有功能都要查找表中的值.

(当然,DaysInMonth为28的所有行都会有20个结果.只有29,30和31的行需要一些工作才能产生)

原文地址:https://www.jb51.cc/mssql/77598.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐