比较时间戳的相等性很少能很好地工作。如果这两个时间戳是在2012-09-19 18:13:26.99999999
? 时钟抖动、调度程序抖动、执行时间差异等可能而且经常会将一个推到下一秒。它也不必那么接近边缘发生。您可以尝试使用 hack
而是与窄范围进行比较;说2秒:
SET timezone = '+04:00';
SELECT (TIMESTAMP '2012-09-19 18:13:26')::timestamptz
BETWEEN TIMESTAMPTZ '2012-09-19 18:13:26.893878-04' - INTERVAL '1' SECOND
AND TIMESTAMPTZ '2012-09-19 18:13:26.893878-04' + INTERVAL '1' SECOND;
我不确定你可以使用比这更粗的东西,因为你的 PHP 时间戳的精度是 1 秒。
如果您确定 PHP 总是截断时间戳(向下舍入)而不是舍入,即使它捕获了时间戳,您也可以通过调整括号间隔来粗略地纠正这一点。例如,尝试 1 秒间隔(给定 PHP 的时间戳精度,您可以测试的最窄间隔)尝试,并假设 PHP 总是将时间戳截断:
SELECT (TIMESTAMP '2012-09-19 18:13:26')::timestamptz
BETWEEN TIMESTAMPTZ '2012-09-19 18:13:26.893878-04' - INTERVAL '1' SECOND
AND TIMESTAMPTZ '2012-09-19 18:13:26.893878-04';
就我个人而言,我会在每边至少再增加 0.1 秒以确保:
SELECT (TIMESTAMP '2012-09-19 18:13:26')::timestamptz
BETWEEN TIMESTAMPTZ '2012-09-19 18:13:26.893878-04' - INTERVAL '1.1' SECOND
AND TIMESTAMPTZ '2012-09-19 18:13:26.893878-04' + INTERVAL '0.1' SECOND;
如果您真的坚持测试相等性,请使用:
regress=# SELECT date_trunc('second', TIMESTAMPTZ '2012-09-19 18:13:26.893878-04');
date_trunc
------------------------
2012-09-19 18:13:26-04
(1 row)
但请注意,测试两个单独捕获的时间戳是否相等是危险和错误的。