2013-06-11 1 views
2

У меня есть таблица AT_OBJECT с двумя полями с нулевым значением TIMESTAMP MODIFIED и CURR_MODIFIED. Мне нужно сравнить их, но миллисекунды не следует учитывать. На данный момент я использую запрос SQL:Есть ли более элегантный способ сравнить временные метки без миллисекунд?

SELECT 
    * 
FROM 
    at_object o 
WHERE 
    DATEDIFF(SECOND, 
    COALESCE(o.modified,  cast('01.01.2000 00:00:00.0000' as TIMESTAMP)), 
    COALESCE(o.curr_modified, cast('01.01.2000 00:00:00.0000' as TIMESTAMP))) > 0 

Он работает, но выглядит как уродливый. Есть ли лучший способ сравнить временные метки без миллисекунд?

ответ

1

Вы можете использовать формулу, как показано ниже, чтобы удалить миллисекунды (на самом деле преобразовать все мс до нуля)

DATEADD(ms, -DATEPART(ms, date), date) 

Так

. 
. 
. 
WHERE 
    DATEADD(ms, -DATEPART(ms, date1), date1) = DATEADD(ms, -DATEPART(ms, date2), date2) 

И вы могли бы убрать, что все вверх, заменив его с (надеюсь, мой синтаксис верен. У меня нет установки Firebird здесь)

CREATE FUNCTION removeMs 
( 
    @inDateTime 
) 
RETURNS DateTime 
AS 
BEGIN 
    RETURN DATEADD(ms, -DATEPART(ms, @inDateTime), @inDateTime) 
END 

, тогда приятно и чисто!

WHERE 
    removeMs(date1) = removeMs(date2) 

Edit: Для Firebird базовая концепция должна работать, но функции немного отличаются

DATEPART -> EXTRACT(MILLISECOND FROM date1) 
DATEADD -> DATEADD(MILLISECOND, -1 * EXTRACT(MILLISECOND FROM date1), date1) 

все из которых могут быть очищены с помощью пользовательской функции (надеюсь, мой синтаксис является правильным)

+0

Однако это не совместимо с Firebird ... – ain

0

Если вам вообще не нужна часть миллисекунд (никогда в вашем программном обеспечении/запросах), самым простым решением было бы сохранить метки времени с соответствующей точностью, то есть без миллисекундов. В DDL было бы как:

CREATE TABLE T (
    Foo TIMESTAMP DEFAULT CURRENT_TIMESTAMP(0) NOT NULL 
); 

Обратите внимание на CURRENT_TIMESTAMP(0) - это берет на себя значение по умолчанию, вставленный двигатель, когда пользователь не предоставляет значение. Если поле (-ы) иногда заполняется пользователем, тогда вам также необходимо написать тридцать тридцать тридцать тридцать тридцать тридцать тридцать тридцать тридцать тридцать тридцать тридцать тридцать тридцать тридцать тридцать тридцать тридцать тридцать тридцать тридцать тридцать тридцать тридцать тридцать тридцать тридцать тридцать тридцать тридцать тридцать тридцать тридцать тридцать тридцать тридцать тридцать тридцать тридцать тридцать тридцать тридцать тридцать тридцать тридцать тридцать тридцать тридцать тридцать тридцать тридцать тридцать тридцать тридцать три четверти.

 Смежные вопросы

  • Нет связанных вопросов^_^