yyyy - convert varchar to numeric sql
Convirtiendo el nombre de un dÃa en su representación entera (9)
En el servidor SQL puede usar 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 puede usar la función DATEPART para obtener el día de la semana como un número entero
declare @date datetime
set @date = ''12/16/08''
select datepart(dw, @date)
Que devuelve 3
Pero digamos que tengo un varchar que contiene la cadena "Tuesday" y quiero convertirlo a su representación entera de 3. Claro, podría escribir la conversión sin mucha molestia, pero preferiría usar una función incorporada . ¿Existe tal función?
En lugar de escribir una función, debe crear una tabla de días de la semana con la descripción y el valor numérico. Entonces puedes simplemente unirte a la mesa para obtener el numérico.
Y si tiene varios días almacenados de múltiples maneras (probablemente en un sistema basado en caracteres), puede poner todas las variantes en la tabla, por lo TUE, martes, martes se asignarán todos al mismo número entero.
Esto puede no servir para un propósito práctico, pero pensé que lo resolvería solo por diversión. :) Los siguientes trabajos.
Recuerde que cuando use DATEPART o DATENAME, el valor de @@ DATEFIRST es importante y puede cambiar sus 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
Bueno, 6 años después y varias versiones de SQL Server, pero todavía no hay una función incorporada para hacer esto (hasta donde yo sé). No estoy seguro si sql-server-2014 hará algo así.
Tomé un enfoque similar al @RussBradberry que acaba 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 porque devolverá el valor tan pronto como se encuentre la coincidencia y no intente 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
Aquí hay una alternativa sucia que uso si no la estoy ejecutando en un conjunto de datos masivo.
Select CHARINDEX(SUBSTRING(''Thursday'',1,3), ''MONTUEWEDTHUFRISATSUN'') / 3 + 1
Simplemente reemplace el jueves con un día de su elección o una variable.
Cómo funciona: SUBSTRING (''jueves'', 1,3) básicamente crea Thu, luego charindex descubre la posición de thu en la cadena que es 10. Luego, dividimos 10 por longitud de palabras de nuestro día, que es 3, que es igual a 3, y porque quiero
Lunes para igualar 1 martes para igualar 2 miércoles para igualar 3 jueves para igualar 4
Agrego 1 al final
entonces el resultado es 4.
Espero que ayude a alguien, pero estoy de acuerdo, probablemente no sea la mejor solución.
Nota: También puede solicitar un conjunto de resultados por número de día al usarlo así:
SELECT ID,DayNamesColumn from mytable ORDER BY CHARINDEX(SUBSTRING(DayNamesColumn ,1,3), ''MONTUEWEDTHUFRISATSUN'') / 3 + 1
Donde DayID
es un valor entero de 1 a 7.
Agregue DayID a una fecha base como 1899-12-31. (Si el domingo es el primer día de la semana, utilice la fecha inicial de 1899-12-30)
1900-01-01 fue el lunes, 1900-01-02 fue el martes, y así sucesivamente.
Por lo tanto:
select DayID,
datename( weekday, dateadd( day, DayID, ''18991231'' ) )
En SQL 2014, puede usar:
SELECT DATEPART (DW, GetDate ()) Esto devolverá el día de la semana como un número entero.
Puede usar la siguiente selección para obtener el ordinal de fecha de la semana 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. Por ejemplo, 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 agregar una tabla de búsqueda, ya que en este caso, los valores son limitados y nunca cambiarán. La combinación de tabla de búsqueda solo agregará costo.
EN MI HUMILDE OPINIÓN; ya que tiene valores limitados, solo usaría una declaración de caso en mis puntos de vista. No es bonito, pero probablemente sea la forma más rápida de hacerlo.
desafortunadamente no hay una función integrada, pero puedes crear la tuya así:
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