Pregunta

En el servidor SQL se puede utilizar la función DATENAME para obtener el día de la semana como una cadena

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

que devuelve "Martes"

y se puede utilizar la función DATEPART para obtener el día de la semana como un entero

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

Lo que devuelve 3

Pero decir que tengo un varchar que contiene la cadena "Martes" y quiero convertirlo a su representación entera de 3. Por supuesto, podría escribir a cabo la conversión sin mucha molestia, pero yo preferiría utilizar un sistema incorporado -en función. ¿Existe una función de este tipo?

¿Fue útil?

Solución

En lugar de escribir una función, se debe crear un día de la mesa de semana con la descripción y el valor numérico. A continuación, puede unirse a la mesa para conseguir el numérico.

Y si usted ha almacenado días múltiples formas (probablemente en un sistema characterbased), puede poner todas las variantes en la tabla, por lo que mar, mar, martes haría todo mapa para el mismo entero.

Otros consejos

lamentablemente no hay una función integrada, pero puede crear su propio como esto:


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

Bien 6 años más tarde y varios versión de SQL Server pero hay todavía ninguna función integrada para realizar esta acción (por lo que yo sé). No estoy seguro si será algo que ver esto.

Tomé enfoque similar al @RussBradberry acabo de hacer con las declaraciones 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

o como alternativa se puede hacer de esta manera, que puede ser un poco más rápido, ya que volverá valor tan pronto como se encuentre partido y no tratar de evaluar otros 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

Esta es una alternativa sucia que utilizo si no estoy corriendo en el conjunto de datos masiva.

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

Basta con sustituir el jueves con un día de su elección o una variable.

¿Cómo funciona: SUBSTRING ( 'Jueves', 1,3), básicamente, crea Jue, entonces charindex entera de la posición del jue en la cadena que es 10. Después dividimos 10 por la longitud de nuestras palabras de día, que es el que 3 es igual a 3, y porque quiero

Lunes a igual a 1 Martes a igual a 2 Miércoles 3 a igual Jueves para igualar 4

agrego 1 al final

lo que el resultado es 4.

Espero que ayude a alguien, pero estoy de acuerdo que probablemente no es la mejor solución.

Nota: También puede ordenar un conjunto de resultados por el número de días al usarlo de esta manera:

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

Puede utilizar la instrucción de selección para obtener el ordinal iso día de la semana de la fecha de 2017-12-15 con respecto a (por ejemplo, independientemente de) la configuración actual de @@ datefirst que determina el primer día de la semana. P.ej. establecer datefirst = 1 para el lunes.

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

No estoy de acuerdo con la respuesta sobre la adición de una tabla de búsqueda, ya que en este caso, los valores son limitados y nunca va a cambiar. La tabla de búsqueda se unen solo añadirá costes.

mi humilde opinión; ya que tienen valores limitados, me acaba de utilizar una declaración de caso en mis puntos de vista. No es bonito, pero es probablemente la manera más rápida de hacerlo.

Esto puede no servir a un propósito práctico, pero yo pensé que iba a averiguarlo sólo por diversión. :) Las siguientes obras.

Recuerde que cuando se utiliza DATEPART o DATENAME que el valor de @@ DATEFIRST es importante y puede cambiar los resultados. Busque SET DATEFIRST en la ayuda en línea.

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

Donde DayID es valor entero 1-7.

Añadir DayID a una fecha cierta base, tal como 12/31/1899. (Si el domingo es el primer día de la semana y luego usar la fecha inicial del 1899-12-30)

  

1900-01-01 era lunes, 1900-01-02 era martes, y así sucesivamente.

Así:

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

En SQL 2014, puede utilizar:

SELECT DATEPART (DW, GetDate ()) Esto devolverá día de la semana como entero.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top