TSQL определяет правильный день

#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.