Хранить данные DayOfWeek в SQL Server - PullRequest
0 голосов
/ 23 мая 2019

Я хочу сохранить данные DayOfWeek в виде столбца в таблице SQL Server.Это возможно?ATM Я сохраняю int и преобразую в DayOfWeek с помощью метода switch, но мне хотелось бы сохранить и извлечь данные непосредственно из базы данных.

ОБНОВЛЕНИЕ Я попытаюсь объяснить.Пользователь создает повторяющееся событие, обычно 2 раза в неделю, например, в понедельник и пятницу.Я хочу создать (при выполнении кода) все повторяющиеся события за определенный месяц, поэтому я хочу сохранить DayOfWeek в SQL, потому что для каждого события пользователь может зарегистрироваться, если присутствовал другой пользователь, поздно или так далее. Здесь частькод:

public static List<int> GetAttendance(int year, int month, DayOfWeek doW_1, DayOfWeek doW_2)
        {
            var days = DateTime.DaysInMonth(year, month);
            var attendances = new List<int>();

            for (int currentDay = 1; currentDay <= days; currentDay++)
            {
                var day = new DateTime(year, month, currentDay);
                if (day.DayOfWeek == doW_1 || day.DayOfWeek == doW_2)
                {
                    attendances.Add(currentDay);
                }
            }

            return attendances;
        }

doW1 и 2 взят из небольшого метода конвертера, сделанного мной, который прочитал в db целое число, сохраненное пользователем, для создания повторяющихся событий.

ОБНОВЛЕНИЕ 2: IЯ хочу хранить данные таким образом, потому что я буду использовать их для ПРОГНОЗА будущих событий с помощью пользовательских данных.Очистить сейчас?

Ответы [ 3 ]

1 голос
/ 23 мая 2019

У вас есть два варианта.

  1. Сохраните значение даты в столбцах Date или DateTime, а при запросах напишите запросы с предложением where, например,

    WHERE DATENAME(WEEKDAY, DateColumn ) = 'Sunday'
    

Ноэто не будет выражением sargable, а для больших наборов данных производительность запросов будет плохой.

Вы также можете сохранить день недели в столбце Varchar (9) и снова использовать DATENAME() для извлечения названия дня недели из значений даты на момент вставки / обновления.

Вы можете индексировать этот столбец и писать простые запросы, например

SELECT * FROM Table
WHERE DateColumName = 'Sunday'

Этот параметр обычно используется в среде хранилища данных, где снижение избыточности данных не является целью, но лучшая производительность чтения -цель.

0 голосов
/ 23 мая 2019

Сохраните его как столбец даты и используйте следующие функции SQL для анализа идентификатора недели или имени недели.

Использование даты делает вашу структуру данных понятной.

SELECT Datepart(weekday, Getdate()) 
SELECT Datename(weekday, Getdate()) 
0 голосов
/ 23 мая 2019

Сохраняйте его как int, но вы можете избавиться от переключателя, просто приведя сохраненный int следующим образом:

DayOfWeek day = DayOfWeek.Friday;

int temp = (int)day;

day = (DayOfWeek)temp;

Console.WriteLine(day); // Friday
...