[
https://issues.apache.org/jira/browse/CALCITE-2818?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16760111#comment-16760111
]
Julian Hyde commented on CALCITE-2818:
--------------------------------------
Good catch. In {{SqlFunctions}} the {{floor(x, y)}} and {{ceil(x, y)}}
functions, for various types of {{x}} and {{y}}, already handle the case that x
is negative. (They assume that {{y}} is positive.) The fix should probably
change the {{mod(x, y)}} functions to do the same.
> Implementation of Extract (ExtractImplementor) returns wrong result for dates
> before Epoch.
> --------------------------------------------------------------------------------------------
>
> Key: CALCITE-2818
> URL: https://issues.apache.org/jira/browse/CALCITE-2818
> Project: Calcite
> Issue Type: Bug
> Reporter: Mickaël Sauvée
> Assignee: Julian Hyde
> Priority: Major
>
> Computation is based on Java modulo that have a certain behaviour on negative
> number.
> For extracting hour, minutes and seconds, the computation is wrong.
> Here is an example on hour extract with the date 30-12-1969T21:13:20+0 is
> -100 000 000 in millisec relative to unix EPoch.
> (-100 000 000 % 86 400 000) / 3 600 000 = -3,77 , so 3 hour is returned, and
> it should be 21.
> For negative input value, it is required to add unit.multiplier.longValue()
> (ie. 8 640 000 in hour case) to the value before dividing it.
> You can use this test (SQLOperatorBaseTest.java):
>
> {code:java}
> @Test public void testExtractWithDatesBeforeUnixEpoch() {
> tester.checkScalar(
> "extract(hour from TIMESTAMP '1969-12-31 21:13:20')",
> "21",
> "BIGINT NOT NULL");
> }{code}
>
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)