diff --git a/docs/reference/sql/functions/date-time.asciidoc b/docs/reference/sql/functions/date-time.asciidoc index 0ae672fc7969..c3158244ec26 100644 --- a/docs/reference/sql/functions/date-time.asciidoc +++ b/docs/reference/sql/functions/date-time.asciidoc @@ -395,6 +395,20 @@ include-tagged::{sql-specs}/docs/docs.csv-spec[dateDiffDateTimeSeconds] include-tagged::{sql-specs}/docs/docs.csv-spec[dateDiffDateQuarters] -------------------------------------------------- +[NOTE] +For `hour` and `minute`, `DATEDIFF` doesn't do any rounding, but instead first truncates +the more detailed time fields on the 2 dates to zero and then calculates the subtraction. + +[source, sql] +-------------------------------------------------- +include-tagged::{sql-specs}/docs/docs.csv-spec[dateDiffDateTimeHours] +-------------------------------------------------- + +[source, sql] +-------------------------------------------------- +include-tagged::{sql-specs}/docs/docs.csv-spec[dateDiffDateTimeMinutes] +-------------------------------------------------- + [source, sql] -------------------------------------------------- include-tagged::{sql-specs}/docs/docs.csv-spec[dateDiffDateMinutes] diff --git a/x-pack/plugin/sql/qa/src/main/resources/datetime.csv-spec b/x-pack/plugin/sql/qa/src/main/resources/datetime.csv-spec index d110be505f12..df94a0d25c0b 100644 --- a/x-pack/plugin/sql/qa/src/main/resources/datetime.csv-spec +++ b/x-pack/plugin/sql/qa/src/main/resources/datetime.csv-spec @@ -307,7 +307,7 @@ DATE_DIFF('mcs', '2019-09-04T11:25:21.123456Z'::datetime, '2019-09-04T11:22:33.9 diff_year | diff_quarter | diff_month | diff_week | diff_day | diff_hours | diff_min | diff_sec | diff_millis | diff_mcsec | diff_nsec -----------+--------------+------------+-----------+----------+------------+----------+-----------+-------------+------------+---------- -57 | -114 | 406 | -947 | 2825 | -123228 | 3762357 | -10265677 | 205849864 | -167135802 | 135802468 +57 | -114 | 406 | -947 | 2825 | -123228 | 3762356 | -10265677 | 205849864 | -167135802 | 135802468 ; selectDiffWithDate diff --git a/x-pack/plugin/sql/qa/src/main/resources/docs/docs.csv-spec b/x-pack/plugin/sql/qa/src/main/resources/docs/docs.csv-spec index 04d9be48ce29..bf58515fbce6 100644 --- a/x-pack/plugin/sql/qa/src/main/resources/docs/docs.csv-spec +++ b/x-pack/plugin/sql/qa/src/main/resources/docs/docs.csv-spec @@ -2495,6 +2495,27 @@ SELECT DATE_DIFF('week', '2019-09-04T11:22:33.000Z'::datetime, '2016-12-08T22:33 // end::dateDiffDateTimeWeeks ; +dateDiffDateTimeHours +// tag::dateDiffDateTimeHours +SELECT DATEDIFF('hours', '2019-11-10T12:10:00.000Z'::datetime, '2019-11-10T23:59:59.999Z'::datetime) AS "diffInHours"; + + diffInHours +------------------------ +11 +// end::dateDiffDateTimeHours +; + + +dateDiffDateTimeMinutes +// tag::dateDiffDateTimeMinutes +SELECT DATEDIFF('minute', '2019-11-10T12:10:00.000Z'::datetime, '2019-11-10T12:15:59.999Z'::datetime) AS "diffInMinutes"; + + diffInMinutes +------------------------ +5 +// end::dateDiffDateTimeMinutes +; + dateDiffDateTimeSeconds // tag::dateDiffDateTimeSeconds SELECT DATE_DIFF('seconds', '2019-09-04T11:22:33.123Z'::datetime, '2019-07-12T22:33:11.321Z'::datetime) AS "diffInSeconds"; diff --git a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/datetime/DateDiff.java b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/datetime/DateDiff.java index 844e14d20003..8dddd9343e01 100644 --- a/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/datetime/DateDiff.java +++ b/x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/scalar/datetime/DateDiff.java @@ -116,12 +116,8 @@ public class DateDiff extends ThreeArgsDateTimeFunction { } private static long diffInMinutes(ZonedDateTime start, ZonedDateTime end) { - long secondsDiff = diffInSeconds(start, end); - if (secondsDiff > 0) { - return (long) Math.ceil(secondsDiff / 60.0d); - } else { - return (long) Math.floor(secondsDiff / 60.0d); - } + // Truncate first to minutes (ignore any seconds and sub-seconds fields) + return (end.toEpochSecond() / 60) - (start.toEpochSecond() / 60); } private static long diffInHours(ZonedDateTime start, ZonedDateTime end) { diff --git a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/datetime/DateDiffProcessorTests.java b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/datetime/DateDiffProcessorTests.java index ab87a52bf264..775319917934 100644 --- a/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/datetime/DateDiffProcessorTests.java +++ b/x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/expression/function/scalar/datetime/DateDiffProcessorTests.java @@ -284,6 +284,61 @@ public class DateDiffProcessorTests extends AbstractSqlWireSerializingTestCase