2

I have a table AT_OBJECT with two TIMESTAMP nullable fields MODIFIED and CURR_MODIFIED. I need to compare them but milliseconds should not be counted. As of now I use SQL request:

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

It works but looks kind of ugly. Is there a better way to compare timestamps without milliseconds?

4

2 回答 2

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)

编辑:对于 Firebird,基本概念应该有效,但功能略有不同

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

所有这些都可以用用户定义的函数来清理(希望我的语法是正确的)

于 2013-06-11T15:52:09.287 回答
0

如果您根本不需要毫秒部分(从不在您的软件/查询中),那么最简单的解决方案是以适当的精度存储时间戳,即没有毫秒。在 DDL 中会是这样的:

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

请注意CURRENT_TIMESTAMP(0)- 当用户不提供值时,这会处理引擎插入的默认值。如果字段有时由用户填写,那么您还必须编写BEFORE INSERT OR UPDATE触发器,从时间戳中“删除”毫秒部分。

于 2013-06-11T15:52:35.390 回答