我需要创建一个函数,该函数将在请求的日期返回一周中的天数

时间:2016-05-25 20:50:23

标签: sql sql-server-2014

像这样的东西(不起作用)

CREATE FUNCTION dbo.udf_DayOfWeek 
     (@b_date DATETIME)
RETURNS VARCHAR(10)
AS
BEGIN
    DECLARE @weekday VARCHAR(10)

    IF (SELECT DATENAME(dw, @b_date) 
        RETURN (@weekday)
END;
GO

使用后

SELECT dbo.udf_DayOfWeek ('May 22, 2016');
GO

返回值1-7(一周中的一天数)

我正在使用SQL Server 2014

2 个答案:

答案 0 :(得分:1)

您将要使用DATEPART()DATENAME()来获取数值,但这可以内联完成,并且实际上不需要它自己的函数。

SELECT DATEPART(weekday,'May 22, 2016')

修复函数语法......

CREATE FUNCTION dbo.udf_DayOfWeek (@b_date DATETIME)
RETURNS INT
AS
BEGIN

    DECLARE @weekday INT
    SELECT @weekday = DATEPART(WEEKDAY, @b_date) 
    RETURN (@weekday)
END
GO

答案 1 :(得分:0)

工作日的DatePart使用DateFirst设置,因此难以一致地使用。问题是,世界上有些地方认为星期日是一周的第一天,而其他地方则认为星期一是一周的第一天。由于这种歧义,SQL Server将使用当前连接到数据库的登录的datefirst设置。要查看datefirst设置列表,请运行以下命令:

Select * From sys.syslanguages

您可以手动设置在连接期间持续存在的DateFirst值,如下所示:

Set DateFirst 1
SELECT DATEPART(weekday,'May 22, 2016')

Set DateFirst 7
SELECT DATEPART(weekday,'May 22, 2016')

请注意,上一代码的输出会根据DateFirst设置而更改。

如果您希望1始终代表星期日,无论用户的语言设置如何,您都可以使用:

Select DateDiff(Day, 6,@DateVariable) % 7 + 1

使用此信息,您可以创建用户定义的函数,如下所示:

CREATE FUNCTION dbo.udf_DayOfWeek 
     (@b_date DATETIME)
RETURNS int
AS
BEGIN
    return (
        Select DateDiff(Day, 6,@b_date) % 7 + 1
    )
END;