Таймер Delphi: Время перед следующим событием

Можно ли определить, когда TTimer в Delphi запустится? Я знаю, как вычислить это на основе последнего запуска таймера и интервала таймеров. К сожалению, код, с которым я работаю, имеет много состояний, и интервал может меняться во многих путях. Я бы предпочел не вести трек о том, когда таймер был включен в последний раз и интервал изменился, а вместо этого получить прямой доступ к этой информации из таймера.

Сценарий: Таймер имеет 2-минутный интервал, прошло 30 секунд с момента последнего включения, как в коде узнать, что через 90 секунд событие таймера снова запустится?

Можно ли получить эту информацию непосредственно из таймера? Или, возможно, ОС? Компонент таймера должен «знать», когда он будет запущен следующим. Откуда она знает? Можно ли получить доступ к этой информации?

-121--1075713- Преобразование в значение datetime завершается ошибкой только в предложении WHERE? Возникли проблемы с некоторыми запросами SQL Server. Оказывается, у меня в варчаре хранится таблица с полями «Attibute_Name» и «Attibute_Value», которая может быть любого типа. (Да... Я знаю.) Все...

Возникли проблемы с некоторыми запросами SQL Server. Оказывается, у меня в варчаре хранится таблица с полями «Attibute_Name» и «Attibute_Value», которая может быть любого типа. (Да... Я знаю.)

Все даты для конкретного атрибута, похоже, хранятся в формате «YYYY-MM-DD hh: mm: ss» (не уверен в этом на 100%, здесь миллионы записей), поэтому я могу выполнить этот код без проблем:

select /*...*/ CONVERT(DATETIME, pa.Attribute_Value)
from 
    ProductAttributes pa
    inner join Attributes a on a.Attribute_ID = pa.Attribute_ID
where 
    a.Attribute_Name = 'SomeDate'

Однако, если я выполню следующий код:

select /*...*/ CONVERT(DATETIME, pa.Attribute_Value)
from 
    ProductAttributes pa
    inner join Attributes a on a.Attribute_ID = pa.Attribute_ID
where 
    a.Attribute_Name = 'SomeDate'
    and CONVERT(DATETIME, pa.Attribute_Value) < GETDATE()

я получу следующую ошибку: Ошибка преобразования даты и/или времени из символьной последовательности.

Почему это происходит с ошибкой в предложении where, а не в предложении select?

Другая подсказка:

Если вместо фильтрации по Attribute_Name я использую фактические Attribute_ID, хранящиеся в базе данных (PK), это будет работать без проблем.

select /*...*/ CONVERT(DATETIME, pa.Attribute_Value)
from 
    ProductAttributes pa
    inner join Attributes a on a.Attribute_ID = pa.Attribute_ID
where 
    a.Attribute_ID = 15
    and CONVERT(DATETIME, pa.Attribute_Value) < GETDATE()

Обновить Спасибо всем за ответы. Мне было трудно выбрать правильный ответ, потому что все указывали на что-то полезное для понимания вопроса. Это определенно было связано с порядком казни. Оказывается, мой первый запрос сработал правильно, потому что сначала было выполнено предложение WHERE, а затем предложение SELECT. Не удалось выполнить второй запрос по той же причине (поскольку атрибуты не были отфильтрованы, преобразование завершилось ошибкой при выполнении того же предложения WHERE). Мой третий запрос работал, потому что идентификатор был частью индекса (PK), поэтому он имел приоритет и сначала сверлил результаты по этому условию.

Спасибо!

10
задан Alpha 2 September 2011 в 13:42
поделиться