Я думаю, что вы можете довольно гибко определить его с помощью следующей структуры таблицы:
CREATE TABLE [dbo].[TarrifWindows](
[Id] [int] NOT NULL,
[StartTime] [datetime] NOT NULL,
[EndTime] [datetime] NOT NULL,
[StartDay] [int] NOT NULL,
[EndDay] [int] NOT NULL,
[TarriffAmount] [money] NOT NULL,
CONSTRAINT [PK_TarrifWindows] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
Поля "День" являются порядковыми номерами дня, а не значениями даты и времени, например, 0 - воскресенье, 5 - пятница. Это должно позволить вам указать любое сумасшедшее окно, которое вы хотите, будь то понедельник - пятница или 2:37 - 2:38 во вторник утром. Чтобы определить, в каком окне вы находитесь, вы просто берете запрос к таблице так, чтобы текущий порядковый номер даты находился между днем начала и конца, а текущее время - между временем начала и конца. Возможно, вам придется заняться какой-нибудь необычной работой с окнами, которые охватывают полночь ... Я не запустил все комбинации в своей голове.
Вы не указали платформу базы данных, поэтому, если вы хотите избежать этого, вы можете сохранить ее в таблице данных и затем сериализовать ее в XML локально. Мне это кажется довольно легким.