在SQL服务器可以使用DATENAME函数来获取星期为一个字符串

declare @date datetime
set @date = '12/16/08'
select datename(dw, @date)
它返回 “星期二”

和您可以使用DATEPART函数来获取星期几作为整数

declare @date datetime
set @date = '12/16/08'
select datepart(dw, @date)

哪些返回3

不过,说我有一个包含字符串“星期二”一个varchar,我想将其转换为3肯定整型表示,我可以写出来,没有什么麻烦的转换,但我宁愿使用内置-in功能。不这样的功能存在?

有帮助吗?

解决方案

而不是写一个函数,你应该创建星期表的天,描述和数值。然后,你可以简单地加入到表以获得数字。

如果您储存天多种方式(可能在characterbased系统),你可以把所有的变种到表中,所以星期二,星期二,星期二都会映射到相同的整数。

其他提示

很不幸,没有一个在功能上建的,但你可以创建自己这样的:


CREATE FUNCTION dbo.WeekDay(@DayOfWeek Varchar(9))
RETURNS INT
            AS
    BEGIN
    DECLARE @iDayofWeek INT
    SELECT @iDayofWeek = CASE @DayOfWeek
                    WHEN 'Sunday' THEN 1
                    WHEN 'Monday' THEN 2
                    WHEN 'Tuesday' THEN 3
                    WHEN 'Wednesday' THEN 4
                    WHEN 'Thursday' THEN 5
                    WHEN 'Friday' THEN 6
                    WHEN 'Saturday' THEN 7
        END
    RETURN (@iDayofWeek)
    END
GO

在6号井年后和SQL Server的几个版本,但仍然没有内置功能来做到这一点(据我所知)。不知道是否将事情做到这一点。

我也采取了类似的方法来@RussBradberry只是IF语句来完成。

CREATE FUNCTION dbo.WeekDayInt (@DayOfWeekName VARCHAR(10))
RETURNS INT
AS
    BEGIN
        DECLARE @DayWeekNumber INT
        IF @DayOfWeekName = 'Sunday'    SET @DayWeekNumber = 1
        IF @DayOfWeekName = 'Monday'    SET @DayWeekNumber = 2
        IF @DayOfWeekName = 'Tuesday'   SET @DayWeekNumber = 3
        IF @DayOfWeekName = 'Wednesday' SET @DayWeekNumber = 4
        IF @DayOfWeekName = 'Thursday'  SET @DayWeekNumber = 5
        IF @DayOfWeekName = 'Friday'    SET @DayWeekNumber = 6
        IF @DayOfWeekName = 'Saturday'  SET @DayWeekNumber = 7;
        RETURN (@DayWeekNumber)
    END

或作为替代方案是可以做到这样,它可以是一个快一点,因为它会匹配遇到尽快返回值,而不是试图评估其它的值。

CREATE FUNCTION dbo.WeekDayInt (@DayOfWeekName VARCHAR(10))
RETURNS INT
AS
    BEGIN
        IF @DayOfWeekName = 'Sunday'    RETURN 1
        IF @DayOfWeekName = 'Monday'    RETURN 2
        IF @DayOfWeekName = 'Tuesday'   RETURN 3
        IF @DayOfWeekName = 'Wednesday' RETURN 4
        IF @DayOfWeekName = 'Thursday'  RETURN 5
        IF @DayOfWeekName = 'Friday'    RETURN 6
        IF @DayOfWeekName = 'Saturday'  RETURN 7;
        RETURN 0;
    END

下面是我如果我不上大规模数据集运行它使用脏的替代方案。

    Select CHARINDEX(SUBSTRING('Thursday',1,3), 'MONTUEWEDTHUFRISATSUN') / 3 + 1

只需用选择或可变的,每天更换星期四。

工作原理:SUBSTRING(“星期四”,1,3)基本上创建星期四,然后通过CHARINDEX我们日字长度是3找出周四的是10分的字符串中的位置,然后我们把10,其等于3,并且因为我想

周一至等于1 周二等于2 周三等于3 周四等于4

予加1后,结束

所以结果是4。

希望帮助别人,但我同意它可能不是最好的解决方案。

注意:还可以通过使用它像这样命令由天数的结果集:

SELECT ID,DayNamesColumn from mytable ORDER BY CHARINDEX(SUBSTRING(DayNamesColumn ,1,3), 'MONTUEWEDTHUFRISATSUN') / 3 + 1

可以使用下面的选择获取日期2017-12-15相对于的异平日序到(例如不论)的@@ DATEFIRST这就决定了一周的第一天的当前设置。例如。设置DATEFIRST = 1星期一

select
  w.weekday_id_iso8601,
  w.weekday_id_datepart,
  w.weekday_name
from (
       values
         (7, 'Monday'),
         (8, 'Tuesday'),
         (9, 'Wednesday'),
         (10, 'Thursday'),
         (11, 'Friday'),
         (12, 'Saturday'),
         (13, 'Sunday'))
     t(weekday_id, weekday_name)
cross apply (
  select
    t.weekday_id - 6 weekday_id_iso8601,
    (t.weekday_id - @@datefirst + 1) % 7 + 1 weekday_id_datepart,
    t.weekday_name
) w
where w.weekday_id_datepart = datepart(weekday, '2017-12-15')

我不同意关于添加的查找表,因为在这种情况下,答案,这些值是有限的,并且将不会改变。查找表加入只会增加成本。

IMHO;既然你有限定值,我只想用一个case语句在我的意见。它不漂亮,但它可能做的最快方式。

这可能不是实际用途,但我想我会弄清楚只是为了好玩。 :)下面的作品。

请记住,使用DATEPART或DATENAME时DATEFIRST的@@值是重要的,并且可以改变你的结果。查找SET DATEFIRST的在线帮助

DECLARE
    @date_name AS VARCHAR(20)

SET @date_name = 'Monday'

SELECT
    DATEPART(dw, my_date)
FROM
    (
    SELECT CAST('1900-01-01' AS DATETIME) AS my_date UNION
    SELECT CAST('1900-01-02' AS DATETIME) AS my_date UNION
    SELECT CAST('1900-01-03' AS DATETIME) AS my_date UNION
    SELECT CAST('1900-01-04' AS DATETIME) AS my_date UNION
    SELECT CAST('1900-01-05' AS DATETIME) AS my_date UNION
    SELECT CAST('1900-01-06' AS DATETIME) AS my_date UNION
    SELECT CAST('1900-01-07' AS DATETIME) AS my_date
    ) AS My_Dates
WHERE
    DATENAME(dw, my_date) = @date_name

其中DayID是整数值为1到7。

添加大卫·到一些基准日期诸如1899年12月31日。 (如果星期日是一周的第一天,然后使用的1899-12-30初始日期)

  

1900-01-01是星期一,1900年1月2日是星期二,等等。

<强>因此:

select DayID, 
       datename( weekday, dateadd( day, DayID, '18991231' ) ) 

在SQL 2014,可以使用:

选择DATEPART(DW,GETDATE())这将返回一周中的一天作为整数。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top