Pergunta

servidor Em SQL que você pode usar a função DATENAME para obter o dia da semana como uma string

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

que retorna "terça-feira"

e você pode usar a função DATEPART para obter o dia da semana como um número inteiro

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

Que retorna 3

Mas dizer que tenho um varchar que contém a string "terça-feira" e eu quero convertê-lo em sua representação inteiro de 3. Claro, eu poderia escrever a conversão sem muito incômodo, mas eu prefiro usar um built -em função. Será que as houver função de um?

Foi útil?

Solução

Ao invés de escrever uma função, você deve criar um dia da mesa de semana com a descrição eo valor numérico. Então você pode simplesmente juntar-se à mesa para obter o numérico.

E se você tem dias armazenadas várias maneiras (provavelmente em um sistema characterbased), você pode colocar todas as variantes na tabela, por isso ter, ter, terça faria tudo mapa para o mesmo número inteiro.

Outras dicas

Não

Infelizmente não há um construído em função, mas você pode criar seu próprio como isto:


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

Bem 6 anos mais tarde e vários versão do SQL Server, mas ainda não built-in função para fazer isso (tanto quanto eu sei). Não tenho certeza se vontade algo para fazer isso.

Eu levei abordagem semelhante à @RussBradberry feito apenas com declarações 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

ou como alternativa pode ser feito desta forma, que pode ser um pouco mais rápido porque ele vai retornar valor assim que jogo for encontrado e não tentar avaliar outros valores.

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

Aqui é uma alternativa suja que eu uso quando não estou executando-o em conjunto maciço de dados.

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

Basta substituir quinta-feira com um dia de sua escolha ou uma variável.

Como funciona: SUBSTRING ( 'quinta-feira', 1,3) basicamente cria Thu, em seguida, encontra charIndex a posição de thu na seqüência que é 10. Em seguida, dividir 10 por tempo de nossas palavras dia que é 3, que é igual a 3, e porque eu quero

Segunda a igual a 1 Terça-feira para igualar 2 Quarta-feira para igualar 3 Quinta-feira para igual 4

eu adicionar 1 ao final

então o resultado é 4.

Espero que ajude alguém, mas concordo que provavelmente não é a melhor solução.

Nota: Você também pode encomendar um conjunto de resultados pelo número do dia, usando-o assim:

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

Você pode usar o seguinte selecione para obter a iso semana ordinal da data 2017-12-15 em relação ao (por exemplo, independentemente do) o cenário atual de @@ DATEFIRST que determina o primeiro dia da semana. Por exemplo. definir DATEFIRST = 1 para segunda-feira.

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')

Não concordo com a resposta sobre a adição de uma tabela de pesquisa, uma vez que, neste caso, os valores são limitados e nunca vai mudar. A tabela de pesquisa juntar-se só vai adicionar custos.

IMHO; desde que você tem valores limitados, gostaria apenas de usar uma instrução caso no meu ponto de vista. Não é bonito, mas é provavelmente a maneira mais rápida de fazê-lo.

Isto pode não servir a um propósito prático, mas eu pensei que eu iria descobrir isso apenas por diversão. :) As seguintes obras.

Lembre-se que quando se utiliza DATEPART ou DATENAME que o valor de @@ DATEFIRST é importante e pode alterar os resultados. Olhe para cima SET DATEFIRST na ajuda online.

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

Onde DayID é valor inteiro 1-7.

Adicionar DayID para uma data alguns base como 1899/12/31. (Se o domingo é o primeiro dia da semana, em seguida, usar a data inicial de 1899-12-30)

1900-01-01 era segunda-feira, 1900-01-02 foi terça-feira, e assim por diante.

Assim:

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

No SQL 2014, você pode usar:

SELECIONAR DATEPART (DW, GetDate ()) Isso irá retornar o dia da semana como um número inteiro.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top