有没有更优雅的方法来比较没有毫秒的时间戳?

时间:2013-06-11 15:32:15

标签: sql timestamp firebird datediff

我有一个表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

它有效,但看起来有点难看。有没有更好的方法来比较没有毫秒的时间戳?

2 个答案:

答案 0 :(得分:1)

您可以使用如下公式删除毫秒(实际将所有ms转换为零)

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)

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

答案 1 :(得分:0)

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

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

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