我有一个表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
它有效,但看起来有点难看。有没有更好的方法来比较没有毫秒的时间戳?
答案 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
个触发器,从时间戳中“删除”毫秒部分。