Как я избегаю использования getdate () в представлении SQL?

Один из способов - написать новый метод расширения

public static bool IsSingle<T>(this IEnumerable<T> enumerable) {
  using (var enumerator = enumerable.GetEnumerator()) {
    if (!enumerator.MoveNext()) {
      return false;
    }
    return !enumerator.MoveNext();
  }
}
.
7
задан geofftnz 29 May 2009 в 00:07
поделиться

5 ответов

Одна из причин вашего вопроса может заключаться в том, чтобы сделать представление более оптимизируемым, удалив преобразование данных. Невозможно сделать это в представлении, вам нужно сделать его хранимой процедурой и выполнить преобразование в переменную:

CREATE PROCEDURE RecentRecordSum AS

DECLARE @adate DATETIME

SELECT @adate = DATEADD(d, -7, GETDATE())

SELECT      t.ID,   
            SUM(t.SomeValue) AS ValueSum  
FROM        SomeTable t  
WHERE       t.RecordDate >= @adate  
GROUP BY    t.ID  
6
ответ дан 7 December 2019 в 05:30
поделиться

Еще один снимок в темноте, как и все ...

Возможно, вы хотите сделать это индексированное представление, что вы не сможете сделать с помощью getdate (), поскольку это неопределенная функция. Раньше я обходил это, вызывая getdate () из другого представления, которое просто содержит

select getdate()

. Этого уровня косвенного обращения было достаточно, чтобы обмануть SQL Server 2000 и позволить мне использовать привязку схемы, но я не могу гарантировать, что это будет работать позже. версии.

2
ответ дан 7 December 2019 в 05:30
поделиться

Предполагая, что у вас есть данные за последний день, подзапрос может сработать:

CREATE VIEW RecentRecordSum AS
SELECT      t.ID,   
            SUM(t.SomeValue) AS ValueSum
FROM        SomeTable t
WHERE       t.RecordDate >= DATEADD(d,-7,(Select Max(RecordDate) From SomeTable))
GROUP BY    t.ID
0
ответ дан 7 December 2019 в 05:30
поделиться

Если я правильно понимаю вопрос, вы всегда можете попробовать внутреннее соединение с набором, содержащим GETDATE (), как в следующем запросе:

SELECT      t.ID,   
            SUM(t.SomeValue) AS ValueSum
FROM        SomeTable t
INNER JOIN (SELECT DATEADD(d,-7,GETDATE()) AS MIN_DATE) MIN_DATE_SET
ON t.RecordDate >= MIN_DATE_SET.MIN_DATE
GROUP BY    t.ID

EDIT: Я просмотрел план запроса для аналогичного сценария, и они идентичны. YMMV.

0
ответ дан 7 December 2019 в 05:30
поделиться
SELECT CURRENT_TIMESTAMP

SELECT {fn NOW()}

Возможно, я неправильно понял вопрос, если вы просто пытаетесь переместить GetDate (), а не заменять его, вы можете выполнить оценку в предложении Have, т.е.

CREATE VIEW RecentRecordSum AS
SELECT      t.ID,   
            SUM(t.SomeValue) AS ValueSum
FROM        SomeTable t
GROUP BY    t.ID, t.RecordDate
HAVING      t.RecordDate >= DATEADD(d,-7,GETDATE())
0
ответ дан 7 December 2019 в 05:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: