#sql-server #date
#sql-сервер #Дата
Вопрос:
Вчера я обнаружил проблему либо с дизайном моей таблицы, либо с запросом, из которого я извлекаю данные, и мне нужны некоторые рекомендации / предложения о том, как действовать дальше и устранить мою проблему.
Моя таблица выглядит следующим образом:
CREATE TABLE
[DT].[CountTotals](
[Acct] [varchar](8) NOT NULL,
[TCount] [smallint] NOT NULL ,
[TDate] [smalldatetime] NOT NULL,
[PostDate] [smalldatetime] NOT NULL ,
[DayCount] [tinyint] NULL ,
[AggCount] [smallint] NULL ,
[AggNumber] [numeric](10, 0) NULL,
[IsReadyToArchive] [bit] NOT NULL
)
Я извлекаю эти данные, используя следующее представление:
CREATE VIEW [DT].[vwGetCountHistory]
AS
SELECT
C.Acct, C.TCount, C.TDate, C.PostDate
, C.DayCount, C.AggCount, C.AggNumber
FROM DT.CountTotals C
UNION
SELECT
AC.Acct, AC.TCount, AC.TDate, AC.PostDate
, AC.DayCount, AC.AggCount, AC.AggNumber
FROM ARCHIVE.DTA.CountTotals AC
Все это работает нормально. В таблице содержится около 300 тысяч записей, в том числе около 5000 новых записей, добавляемых в нее каждый день, а PostDate — это дата добавления записей. Моя проблема исходит из поля DayCount — это поле увеличивается на 1 каждый день, когда оно находится в таблице, до PostDate is < GetDate()-90
. Моя проблема заключается в следующем запросе:
SELECT
Acct
, SUM(AggCount) AS SumofAggCount
FROM DT.vwGetCountHistory
WHERE (DayCount <= 5)
AND
(
PostDate >= @BusinessDate - 90
AND PostDate <= @BusinessDate
)
GROUP BY Acct
HAVING (SUM(AggCount) >= 4)
Этот запрос прекрасно работает, если я ищу текущую дату, потому что DayCount будет правильным. Но глупый я забыл, что они могут искать данные за предыдущие дни, поэтому мой DayCount будет увеличиваться каждый день с момента PostDate.
Я ищу предложения о том, как устранить эту проблему. Есть ли способ определить правильное количество дней?
Комментарии:
1. у вас есть какой-то процесс, который увеличивает количество дней?
2. Да, у меня есть утреннее задание, которое запускает сохраненную процедуру для выполнения обновления.
Ответ №1:
Вместо того, чтобы хранить и управлять DayCount, можете ли вы вычислить количество дней между @BusinessDate и PostDate в вашем запросе?
Комментарии:
1. это идея, но бизнес непреклонен в хранении и поддержании DayCount. Но если я не могу найти другое решение, мне, возможно, придется предложить это им.
2. спасибо за отзыв. Я собираюсь вручную рассчитать количество дней на основе вашего предложения. На самом деле я об этом не подумал
Ответ №2:
В целом я согласен с @n8wrl в том, что DayCount, скорее всего, не следует сохранять и следует вычислять «на лету», но если это не вариант, то, по крайней мере, сделайте его вычисляемым столбцом, где это DATEDIFF между PostDate и GETDATE() и избавьтесь от этого ночного процесса. Конечно, это все равно было бы, по сути, обработкой на лету, но я не думаю, что снижение производительности было бы плохим, учитывая потенциальный риск того, что ночное задание не будет запущено или будет запущено дважды и т.д.
Теперь, при неотложной необходимости, можете ли вы просто сделать тест DayCount более динамичным, например:
WHERE (DayCount <= (5 DATEDIFF(DAY, @BusinessDate, PostDate)))
Делая это, мы добавляем 1 к условию, чтобы оно было DayCount <= 6, поскольку вчерашние записи, отвечающие требованиям, теперь имеют DayCount равный 6.