代码之家  ›  专栏  ›  技术社区  ›  Ryan

将一天的名称转换为整数表示形式

  •  5
  • Ryan  · 技术社区  · 16 年前

    在SQL Server中,可以使用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,它包含字符串“Tuesday”,我想将其转换为3的整数表示形式。当然,我可以不费吹灰之力地写出转换结果,但我更愿意使用内置函数。这种功能存在吗?

    9 回复  |  直到 7 年前
        1
  •  10
  •   HLGEM    16 年前

    与其编写函数,不如创建一个包含描述和数字值的星期表。然后您可以简单地联接到表中以获得数字。

    如果您有多个存储方式(可能在基于字符的系统中),那么您可以将所有变量放入表中,因此周二和周二都将映射到相同的整数。

        2
  •  10
  •   Russ Bradberry    16 年前

    不幸的是,没有内置函数,但您可以这样创建自己的函数:

    
    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
    
        3
  •  2
  •   user275683    11 年前

    六年后,还有几个版本的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
    
        4
  •  2
  •   David Rosher    10 年前

    如果我不在海量数据集上运行它,这里有一个脏的替代方法。

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

    只需将星期四替换为您选择的日期或变量。

    工作原理:substring(“thursday”,1,3)基本上创建了thu,然后charindex找出thu在字符串中的位置,即10。然后我们用10除以一天中的单词长度,3等于3,因为我想要

    星期一等于1 星期二等于2 星期三等于3 星期四等于4

    最后加1

    结果是4。

    希望能帮助别人,但我同意这可能不是最好的解决办法。

    注意:您也可以按天编号订购结果集,方法如下:

    SELECT ID,DayNamesColumn from mytable ORDER BY CHARINDEX(SUBSTRING(DayNamesColumn ,1,3), 'MONTUEWEDTHUFRISATSUN') / 3 + 1
    
        5
  •  1
  •   user3099799    7 年前

    可以使用以下选项获取ISO工作日序号 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')
    
        6
  •  0
  •   John MacIntyre    16 年前

    我不同意添加查阅表格的答案,因为在这种情况下,值是有限的,永远不会改变。查阅表格联接只会增加成本。

    imho;因为您的值有限,所以我只在视图中使用case语句。它不漂亮,但可能是最快的方法。

        7
  •  0
  •   Tom H zenazn    16 年前

    这可能不是一个实际的目的,但我想我会想出来只是为了好玩。:)以下工作。

    请记住,当使用datepart或datename时,@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
    
        8
  •  0
  •   Chiragkumar Thakar Sam    10 年前

    在哪里? DayID 是整数值1到7。

    将dayid添加到一些基准日期,如1899-12-31。(如果星期日是星期一的第一天,则使用1899-12-30的初始日期)

    1900-01-01是星期一,1900-01-02是星期二,以此类推。

    因此:

    select DayID, 
           datename( weekday, dateadd( day, DayID, '18991231' ) ) 
    
        9
  •  0
  •   Jessie Copeland    9 年前

    在SQL 2014中,您可以使用:

    选择datepart(dw,getdate())这将以整数形式返回星期几。