Найдено результатов: 3

Обновить Результаты Функции Excel VBA

Кто-нибудь знает, как я могу заставить пользовательскую функцию повторно оценить себя (на основе измененных данных в электронной таблице)? Я пробовал F9 и Shift + F9 , но они не работают. Единственное, что, кажется, работает, это редактирование ячейки с помощью вызова функции и затем нажатие клавиши Enter. Есть какие-нибудь идеи? Я, кажется, помню, что был в состоянии сделать это...

excel   vba   excel-vba   user-defined-functions    

520   8   09:27, 12th August, 2020


Обновить Результаты Функции Excel VBA

Кто-нибудь знает, как я могу заставить пользовательскую функцию повторно оценить себя (на основе измененных данных в электронной таблице)? Я пробовал F9 и Shift + F9 , но они не работают. Единственное, что, кажется, работает, это редактирование ячейки с помощью вызова функции и затем нажатие клавиши Enter. Есть какие-нибудь идеи? Я, кажется, помню, что был в состоянии сделать это...

excel   vba   excel-vba   user-defined-functions    

482   8   04:32, 22nd August, 2020


Какой хороший способ проверить, находятся ли две даты в один и тот же календарный день в TSQL?

Вот проблема, с которой я сталкиваюсь: у меня есть большой запрос, который должен сравнить даты в предложении where, чтобы увидеть, если две даты находятся в один и тот же день. Мое текущее решение, которое отстойно, состоит в том, чтобы отправить даты в UDF, чтобы преобразовать их в полночь того же дня, а затем проверить эти даты на равенство. Когда дело доходит до плана запроса, это катастрофа, как и почти все UDFs в предложениях joins или where. Это одно из немногих мест в моем приложении, где я не смог искоренить функции и дать оптимизатору запросов то, что он действительно может использовать для поиска лучшего индекса.

В этом случае слияние кода функции обратно в запрос кажется нецелесообразным.

Мне кажется, я упускаю здесь что-то простое.

Вот функция для справки.

if not exists (select * from dbo.sysobjects 
              where id = object_id(N'dbo.f_MakeDate') and               
              type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
  exec('create function dbo.f_MakeDate() returns int as 
         begin declare @retval int return @retval end')
go

alter function dbo.f_MakeDate
(
    @Day datetime, 
    @Hour int, 
    @Minute int
)
returns datetime
as

/*

Creates a datetime using the year-month-day portion of @Day, and the 
@Hour and @Minute provided

*/

begin

declare @retval datetime
set @retval = cast(
    cast(datepart(m, @Day) as varchar(2)) + 
    '/' + 
    cast(datepart(d, @Day) as varchar(2)) + 
    '/' + 
    cast(datepart(yyyy, @Day) as varchar(4)) + 
    ' ' + 
    cast(@Hour as varchar(2)) + 
    ':' + 
    cast(@Minute as varchar(2)) as datetime)
return @retval
end

go

Чтобы усложнить ситуацию, я подключаюсь к таблицам часовых поясов, чтобы проверить дату по местному времени, которое может отличаться для каждой строки:

where 
dbo.f_MakeDate(dateadd(hh, tz.Offset + 
    case when ds.LocalTimeZone is not null 
    then 1 else 0 end, t.TheDateINeedToCheck), 0, 0) = @activityDateMidnight

[Редактировать]

Я включаю предложение @Todd's:

where datediff(day, dateadd(hh, tz.Offset + 
    case when ds.LocalTimeZone is not null 
    then 1 else 0 end, t.TheDateINeedToCheck), @ActivityDate) = 0

Мое неправильное представление о том, как работает datediff (один и тот же день года в последовательные годы дает 366, а не 0, как я ожидал), заставило меня потратить много усилий.

Но план запроса не изменился. Я думаю, что мне нужно вернуться к чертежной доске со всем этим.

sql   sql-server   tsql   datetime   user-defined-functions    

453   10   19:32, 19th August, 2020