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

时间:2008-12-22 21:40:01

标签: sql sql-server type-conversion

在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的整数表示。当然,我可以毫不费力地写出转换,但我宁愿使用内置的-in功能。这样的功能是否存在?

9 个答案:

答案 0 :(得分:11)

遗憾的是,没有内置功能,但您可以像这样创建自己的功能:


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

答案 1 :(得分:10)

您应该使用描述和数值创建星期几表,而不是编写函数。你可以简单地加入到表中来获取数字。

如果你有多种方式存储(可能在基于字符的系统中),你可以将所有变体放入表中,因此TUE,Tues。,Tuesday将全部映射到相同的整数。

答案 2 :(得分:2)

6年后,几个版本的SQL Server,但仍然没有内置函数来做到这一点(据我所知)。不确定是否可以执行此操作。

我使用IF语句对@RussBradberry采取了类似的方法。

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

答案 3 :(得分:2)

如果我没有在海量数据集上运行它,那么这是一个脏的替代方案。

    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

答案 4 :(得分:1)

您可以使用以下选项获取日期2017-12-15的iso工作日序号(例如,无论如何)@@ 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')

答案 5 :(得分:0)

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

IMHO;由于你的值有限,我只想在我的视图中使用case语句。它不漂亮,但它可能是最快的方式。

答案 6 :(得分:0)

这可能不符合实际目的,但我认为我只是为了好玩而想出来。 :)以下作品。

请记住,在使用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

答案 7 :(得分:0)

其中DayID是整数值1到7。

将DayID添加到某个基准日期,例如1899-12-31。 (如果星期日是星期的第一天,那么使用1899-12-30的初始日期)

  

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

因此:

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

答案 8 :(得分:0)

在SQL 2014中,您可以使用:

SELECT DATEPART(DW,GetDate())这将以星期形式返回星期几。

相关问题