/ / Varios días de la semana almacenados en un campo - sql, sql-server-2008, fecha

Varios días de la semana almacenados en un campo: sql, sql-server-2008, fecha

He encontrado un poco de un obstáculo mental con respecto a la forma en que un campo entero específico está almacenando datos.

Concretamente, hay una columna con enteros.que van desde 1 hasta 127; cada entero representa una combinación de diferentes días de la semana. Por ejemplo: lunes = 2 ^ 0 o 1, martes = 2 ^ 2 o 2, miércoles = 2 ^ 3 u 8; Con la opción de adición, lunes + martes = 3.

He podido extraer los valores de fecha parcialmente usando el ejemplo encontrado aquí. Sin embargo, ese ejemplo en particular no funciona cuando se suman dos días (por ejemplo, lunes + martes = 3). ¿Alguien puede señalarme en la dirección correcta?

Para su información, estoy usando SQL Server 2008 R2. Mis disculpas si esto ha sido publicado anteriormente, eché un vistazo pero no pude encontrar ninguna otra publicación.

Respuestas

1 para la respuesta № 1

Lo que estás tratando se conoce como operadores bitwise.

Aquí está un buena lectura en él con ejemplos claros y simples.

En aras de la integridad, esto es lo que está viendo desglosado en columnas para cada día de la semana.

DECLARE @bitwise TABLE (someValue TINYINT)

INSERT INTO @bitwise (someValue)
SELECT 1 UNION
SELECT 5 UNION
SELECT 127

SELECT someValue, CASE WHEN (1&someValue)=1 THEN "SUNDAY" END
, CASE WHEN (2&someValue)=2 THEN "MONDAY" END
, CASE WHEN (4&someValue)=4 THEN "TUESDAY" END
, CASE WHEN (8&someValue)=8 THEN "WEDNESDAY" END
, CASE WHEN (16&someValue)=16 THEN "THURSDAY" END
, CASE WHEN (32&someValue)=32 THEN "FRIDAY" END
, CASE WHEN (64&someValue)=64 THEN "SATURDAY" END

FROM @bitwise

2 para la respuesta № 2

Parece que puedes tomar el bit que necesitas y almacenar el resultado en su propio campo para cada día de la semana.

SELECT
cast(day_of_week & 1 as bit) AS "Monday",
cast(day_of_week & 2 as bit) AS "Tuesday",
cast(day_of_week & 4 as bit) AS "Wednesday",
cast(day_of_week & 8 as bit) AS "Thursday",
etc...

0 para la respuesta № 3

Necesitará usar operadores bitwise, lo más probable.

SELECT *
FROM Table
WHERE DaysOfWeek & 3 = 3

O, si tiene más sentido:

SELECT *
FROM Table
WHERE DaysOfWeek & 1 = 1
AND DaysOfWeek & 2 = 2

Le sugiero que cree una VISTA con una consulta como la que describe @JNevill.