Фильтрация элементов путем сравнения даты и времени
Фильтрация повторяющихся элементов в папке календаря
Чтобы отфильтровать коллекцию элементов встречи, включающих повторяющиеся встречи, необходимо использовать коллекцию Элементы . С помощью свойства Items.IncludeRecurrences можно указать, что метод Items.Find или Items.Restrict должен включать повторяющиеся встречи. Объект Table возвращает только одну строку, представляющую элемент повторяющейся встречи, а не отдельные строки для каждого экземпляра встречи.
Формат даты и времени строк сравнения
Outlook оценивает значения даты и времени согласно параметрам формата времени, краткого и полного форматов даты в приложении "Язык и региональные стандарты" на панели управления Windows. В частности, Outlook оценивает время согласно заданному формату времени без учета секунд. Если вы укажете секунды в строке сравнения даты и времени, фильтр будет работать неправильно.
Несмотря на то что даты и время обычно хранятся в формате даты, для работы фильтров, в которых используются синтаксисы Jet и DAV Searching and Locating (DASL), требуется, чтобы значение даты и времени было преобразовано в строковое представление. В синтаксисе Jet строка сравнения даты и времени должна быть заключена в двойные или одинарные кавычки. В синтаксисе DASL строка сравнения даты и времени должна быть заключена в одинарные кавычки.
Чтобы убедиться, что строка сравнения даты и времени отформатирована так, как ожидается в Microsoft Outlook, используйте функцию Visual Basic для приложений Format (или ее эквивалент на языке программирования). В примере ниже показано, как создать фильтр Jet, чтобы найти все контакты, измененные до 15:30 12 июня 2005 г. по местному времени.
criteria = "[LastModificationTime] < '" _
& Format$("6/12/2005 3:30PM","General Date") & "'"
Часовые пояса, используемые в сравнении
Если явное встроенное свойство ссылается в запросе Jet с его явным строковым именем, сравнение оценивает значение свойства и строку сравнения даты и времени как значения локального времени.
Если в запросе DASL имеется ссылка на свойство по пространству имен, функция сравнения оценивает значение свойства и строку сравнения даты и времени в виде значений времени в формате UTC. Например, указанный ниже запрос DASL выполняется поиск всех контактов, измененных до 15:30 12 июня 2005 г. по времени в формате UTC.
criteria = "@SQL=" & Chr(34) & "DAV:getlastmodified" & Chr(34) _
& " < '" & Format$("6/12/2005 3:30PM","General Date") & "'"
Преобразование времени в формат UTC для запросов DASL
Запросы DASL всегда выполняют сравнение даты и времени в формате UTC, поэтому если вы применяете литерал даты в строке сравнения, то для сравнения вам необходимо использовать его значение в формате UTC. Используйте вспомогательную функцию Row.LocalTimeToUTC или макросы даты и времени Outlook, чтобы упростить преобразование.
LocalTimeToUTC
Одним из способов упростить преобразование местного времени в UTC является использование вспомогательной функции LocalTimeToUTC объекта Row . В следующей строке кода эта вспомогательная функция используется для преобразования значения свойства LastModificationTime (которое представляет собой столбец, используемый по умолчанию во всех объектах Table):
Row.LocalTimeToUTC("LastModificationTime")
Макросы для работы с датой и временем в Outlook
Макросы даты, перечисленные ниже, возвращают строки фильтра, которые сравнивают значение заданного свойства даты и времени с указанной датой в формате UTC; SchemaName — это любое допустимое свойство даты и времени, на которое ссылается пространство имен.
Примечание Макросы даты и времени Outlook можно использовать только в запросах DASL.
Macro | Синтаксис | Описание |
---|---|---|
today | %today("ИмяСхемы")% | Ограничения для элементов со значением свойства SchemaName , равным сегодняшнему значению |
tomorrow | %tomorrow("ИмяСхемы")% | Ограничения для элементов со значением свойства SchemaName , равным будущему |
yesterday | %yesterday("ИмяСхемы")% | Ограничивает элементы со значением свойства SchemaName , равным вчера |
next7days | %next7days("ИмяСхемы")% | Ограничивает для элементов со значением свойства SchemaName , равным следующим 7 дням |
last7days | %last7days("ИмяСхемы")% | Ограничения для элементов со значением свойства SchemaName , равным последним 7 дням |
nextweek | %nextweek("ИмяСхемы")% | Ограничения для элементов со значением свойства SchemaName , равным на следующей неделе |
thisweek | %thisweek("ИмяСхемы")% | Ограничения для элементов со значением свойства SchemaName , равным этой неделе |
lastweek | %lastweek("ИмяСхемы")% | Ограничения для элементов со значением свойства SchemaName , равным значению на прошлой неделе |
nextmonth | %nextmonth("ИмяСхемы")% | Ограничения для элементов со значением свойства SchemaName , равным следующему месяцу |
thismonth | %thismonth("ИмяСхемы")% | Ограничения для элементов со значением свойства SchemaName , равным этому месяцу |
lastmonth | %lastmonth("ИмяСхемы")% | Ограничения для элементов со значением свойства SchemaName , равным значению за прошлый месяц |
Пример, в котором показано преобразование в формат UTC
В следующем примере кода показаны три строки фильтра, которые возвращают все сообщения, полученные сегодня, и применяется один из фильтров к Items.Restrict и Application.AdvancedSearch. Сначала он использует PropertyAccessor.LocalTimeToUTC для преобразования текущей даты в строки дат в формате UTC. Первый фильтр использует макрос Outlook (сегодня) для получения строки фильтра, которая сравнивает свойство ReceivedTime с текущей датой в формате UTC. Второй и третий макросы ссылаются на свойство ReceivedTime по двум различным пространствам имен.
В завершение в примере кода к элементам в папке "Входящие" дважды применяется третий фильтр: первый раз с использованием элемента Items.Restrict и второй раз с использованием элемента Application.AdvancedSearch. Далее в примере кода выполняется печать количества элементов в папке "Входящие" и количества элементов, возвращенных при каждом применении фильтра.
Public blnSearchComp As Boolean
Sub TestDASLDateComparison()
Dim strFilter As String
Dim colItems As Outlook.Items
Dim colRestrict As Outlook.Items
Dim oSearch As Outlook.Search
Dim oResults As Outlook.Results
Dim datStartUTC As Date
Dim datEndUTC As Date
Dim oMail As MailItem
Dim oPA As PropertyAccessor
Const SchemaPropTag As String = _
"https://schemas.microsoft.com/mapi/proptag/"
'Get items from Inbox
Set colItems = _
Application.Session.GetDefaultFolder(olFolderInbox).Items
'This code is a workaround to get today's date
'as UTC for DASL date comparison
Set oMail = Application.CreateItem(olMailItem)
Set oPA = oMail.PropertyAccessor
datStartUTC = oPA.LocalTimeToUTC(Date)
datEndUTC = oPA.LocalTimeToUTC(DateAdd("d", 1, Date))
'All three filters shown below will return the same results
'This filter uses DASL date macro for today
strFilter = "%today(" _
& AddQuotes("urn:schemas:httpmail:datereceived") & ")%"
'This filter uses urn:schemas:httpmail namespace
strFilter = AddQuotes("urn:schemas:httpmail:datereceived") _
& " > '" & datStartUTC & "' AND " _
& AddQuotes("urn:schemas:httpmail:datereceived") _
& " < '" & datEndUTC & "'"
'This filter uses https://schemas.microsoft.com/mapi/proptag
strFilter = AddQuotes(SchemaPropTag & "0x0E060040") _
& " > '" & datStartUTC & "' AND " _
& AddQuotes(SchemaPropTag & "0x0E060040") _
& " < '" & datEndUTC & "'"
'Count of items in Inbox
Debug.Print (colItems.Count)
'This call succeeds with @SQL prefix
Set colRestrict = colItems.Restrict("@SQL=" & strFilter)
'Get count of restricted items
Debug.Print (colRestrict.Count)
Set oSearch = Application.AdvancedSearch("Inbox", strFilter, False)
While blnSearchComp = False
DoEvents
Wend
'Get count from Search object
Set oResults = oSearch.Results
Debug.Print (oResults.Count)
End Sub
Public Function AddQuotes(ByVal SchemaName As String) As String
On Error Resume Next
AddQuotes = Chr(34) & SchemaName & Chr(34)
End Function
Private Sub Application_AdvancedSearchComplete(ByVal SearchObject As Search)
MsgBox "The AdvancedSearchComplete Event fired"
blnSearchComp = True
End Sub
Поддержка и обратная связь
Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.