GoogleSQL for Spanner supports the following interval functions.
Function list
| Name | Summary | 
|---|---|
  EXTRACT 
 
 |  
 Extracts part of an INTERVAL 
value. |  
  JUSTIFY_DAYS 
 
 |  
 Normalizes the day part of an INTERVAL 
value. |  
  JUSTIFY_HOURS 
 
 |  
 Normalizes the time part of an INTERVAL 
value. |  
  JUSTIFY_INTERVAL 
 
 |  
 Normalizes the day and time parts of an INTERVAL 
value. |  
  MAKE_INTERVAL 
 
 |  
 Constructs an INTERVAL 
value. |  
 EXTRACT 
 
   EXTRACT 
 ( 
 part 
  
 FROM 
  
 interval_expression 
 ) 
 
 
Description
Returns the value corresponding to the specified date part. The part 
must be
one of YEAR 
, MONTH 
, DAY 
, HOUR 
, MINUTE 
, SECOND 
, MILLISECOND 
or MICROSECOND 
.
Return Data Type
 INTERVAL 
Examples
In the following example, different parts of two intervals are extracted.
  SELECT 
  
 EXTRACT 
 ( 
 YEAR 
  
 FROM 
  
 i 
 ) 
  
 AS 
  
 year 
 , 
  
 EXTRACT 
 ( 
 MONTH 
  
 FROM 
  
 i 
 ) 
  
 AS 
  
 month 
 , 
  
 EXTRACT 
 ( 
 DAY 
  
 FROM 
  
 i 
 ) 
  
 AS 
  
 day 
 , 
  
 EXTRACT 
 ( 
 HOUR 
  
 FROM 
  
 i 
 ) 
  
 AS 
  
 hour 
 , 
  
 EXTRACT 
 ( 
 MINUTE 
  
 FROM 
  
 i 
 ) 
  
 AS 
  
 minute 
 , 
  
 EXTRACT 
 ( 
 SECOND FROM 
  
 i 
 ) 
  
 AS 
  
 second 
 , 
  
 EXTRACT 
 ( 
 MILLISECOND 
  
 FROM 
  
 i 
 ) 
  
 AS 
  
 milli 
 , 
  
 EXTRACT 
 ( 
 MICROSECOND 
  
 FROM 
  
 i 
 ) 
  
 AS 
  
 micro 
 FROM 
  
 UNNEST 
 ( 
 [ 
 INTERVAL 
  
 '1-2 3 4:5:6.789999' 
  
 YEAR 
  
 TO 
  
 SECOND 
 , 
  
 INTERVAL 
  
 '0-13 370 48:61:61' 
  
 YEAR 
  
 TO 
  
 SECOND 
 ] 
 ) 
  
 AS 
  
 i 
 /*------+-------+-----+------+--------+--------+-------+--------* 
 | year | month | day | hour | minute | second | milli | micro  | 
 +------+-------+-----+------+--------+--------+-------+--------+ 
 | 1    | 2     | 3   | 4    | 5      | 6      | 789   | 789999 | 
 | 1    | 1     | 370 | 49   | 2      | 1      | 0     | 0      | 
 *------+-------+-----+------+--------+--------+-------+--------*/ 
 
 
When a negative sign precedes the time part in an interval, the negative sign distributes over the hours, minutes, and seconds. For example:
  SELECT 
  
 EXTRACT 
 ( 
 HOUR 
  
 FROM 
  
 i 
 ) 
  
 AS 
  
 hour 
 , 
  
 EXTRACT 
 ( 
 MINUTE 
  
 FROM 
  
 i 
 ) 
  
 AS 
  
 minute 
 FROM 
  
 UNNEST 
 ( 
 [ 
 INTERVAL 
  
 '10 -12:30' 
  
 DAY 
  
 TO 
  
 MINUTE 
 ] 
 ) 
  
 AS 
  
 i 
 /*------+--------* 
 | hour | minute | 
 +------+--------+ 
 | -12  | -30    | 
 *------+--------*/ 
 
 
When a negative sign precedes the year and month part in an interval, the negative sign distributes over the years and months. For example:
  SELECT 
  
 EXTRACT 
 ( 
 YEAR 
  
 FROM 
  
 i 
 ) 
  
 AS 
  
 year 
 , 
  
 EXTRACT 
 ( 
 MONTH 
  
 FROM 
  
 i 
 ) 
  
 AS 
  
 month 
 FROM 
  
 UNNEST 
 ( 
 [ 
 INTERVAL 
  
 '-22-6 10 -12:30' 
  
 YEAR 
  
 TO 
  
 MINUTE 
 ] 
 ) 
  
 AS 
  
 i 
 /*------+--------* 
 | year | month  | 
 +------+--------+ 
 | -22  | -6     | 
 *------+--------*/ 
 
 
 JUSTIFY_DAYS 
 
   JUSTIFY_DAYS 
 ( 
 interval_expression 
 ) 
 
 
Description
Normalizes the day part of the interval to the range from -29 to 29 by incrementing/decrementing the month or year part of the interval.
Return Data Type
 INTERVAL 
Example
  SELECT 
  
 JUSTIFY_DAYS 
 ( 
 INTERVAL 
  
 29 
  
 DAY 
 ) 
  
 AS 
  
 i1 
 , 
  
 JUSTIFY_DAYS 
 ( 
 INTERVAL 
  
 - 
 30 
  
 DAY 
 ) 
  
 AS 
  
 i2 
 , 
  
 JUSTIFY_DAYS 
 ( 
 INTERVAL 
  
 31 
  
 DAY 
 ) 
  
 AS 
  
 i3 
 , 
  
 JUSTIFY_DAYS 
 ( 
 INTERVAL 
  
 - 
 65 
  
 DAY 
 ) 
  
 AS 
  
 i4 
 , 
  
 JUSTIFY_DAYS 
 ( 
 INTERVAL 
  
 370 
  
 DAY 
 ) 
  
 AS 
  
 i5 
 /*--------------+--------------+-------------+---------------+--------------* 
 | i1           | i2           | i3          | i4            | i5           | 
 +--------------+--------------+-------------+---------------+--------------+ 
 | 0-0 29 0:0:0 | -0-1 0 0:0:0 | 0-1 1 0:0:0 | -0-2 -5 0:0:0 | 1-0 10 0:0:0 | 
 *--------------+--------------+-------------+---------------+--------------*/ 
 
 
 JUSTIFY_HOURS 
 
   JUSTIFY_HOURS 
 ( 
 interval_expression 
 ) 
 
 
Description
Normalizes the time part of the interval to the range from -23:59:59.999999 to 23:59:59.999999 by incrementing/decrementing the day part of the interval.
Return Data Type
 INTERVAL 
Example
  SELECT 
  
 JUSTIFY_HOURS 
 ( 
 INTERVAL 
  
 23 
  
 HOUR 
 ) 
  
 AS 
  
 i1 
 , 
  
 JUSTIFY_HOURS 
 ( 
 INTERVAL 
  
 - 
 24 
  
 HOUR 
 ) 
  
 AS 
  
 i2 
 , 
  
 JUSTIFY_HOURS 
 ( 
 INTERVAL 
  
 47 
  
 HOUR 
 ) 
  
 AS 
  
 i3 
 , 
  
 JUSTIFY_HOURS 
 ( 
 INTERVAL 
  
 - 
 12345 
  
 MINUTE 
 ) 
  
 AS 
  
 i4 
 /*--------------+--------------+--------------+-----------------* 
 | i1           | i2           | i3           | i4              | 
 +--------------+--------------+--------------+-----------------+ 
 | 0-0 0 23:0:0 | 0-0 -1 0:0:0 | 0-0 1 23:0:0 | 0-0 -8 -13:45:0 | 
 *--------------+--------------+--------------+-----------------*/ 
 
 
 JUSTIFY_INTERVAL 
 
   JUSTIFY_INTERVAL 
 ( 
 interval_expression 
 ) 
 
 
Description
Normalizes the days and time parts of the interval.
Return Data Type
 INTERVAL 
Example
  SELECT 
  
 JUSTIFY_INTERVAL 
 ( 
 INTERVAL 
  
 '29 49:00:00' 
  
 DAY 
  
 TO 
  
 SECOND 
 ) 
  
 AS 
  
 i 
 /*-------------* 
 | i           | 
 +-------------+ 
 | 0-1 1 1:0:0 | 
 *-------------*/ 
 
 
 MAKE_INTERVAL 
 
   MAKE_INTERVAL 
 ( 
  
 [ 
  
 [ 
  
 year 
  
 = 
>  
 ] 
  
 value 
  
 ] 
  
 [ 
 , 
  
 [ 
  
 month 
  
 = 
>  
 ] 
  
 value 
  
 ] 
  
 [ 
 , 
  
 [ 
  
 day 
  
 = 
>  
 ] 
  
 value 
  
 ] 
  
 [ 
 , 
  
 [ 
  
 hour 
  
 = 
>  
 ] 
  
 value 
  
 ] 
  
 [ 
 , 
  
 [ 
  
 minute 
  
 = 
>  
 ] 
  
 value 
  
 ] 
  
 [ 
 , 
  
 [ 
  
 second 
  
 = 
>  
 ] 
  
 value 
  
 ] 
 ) 
 
 
Description
Constructs an  INTERVAL 
 
object using INT64 
values
representing the year, month, day, hour, minute, and second. All arguments are
optional, 0 
by default, and can be named arguments 
.
Return Data Type
 INTERVAL 
Example
  SELECT 
  
 MAKE_INTERVAL 
 ( 
 1 
 , 
  
 6 
 , 
  
 15 
 ) 
  
 AS 
  
 i1 
 , 
  
 MAKE_INTERVAL 
 ( 
 hour 
  
 = 
>  
 10 
 , 
  
 second 
  
 = 
>  
 20 
 ) 
  
 AS 
  
 i2 
 , 
  
 MAKE_INTERVAL 
 ( 
 1 
 , 
  
 minute 
  
 = 
>  
 5 
 , 
  
 day 
  
 = 
>  
 2 
 ) 
  
 AS 
  
 i3 
 /*--------------+---------------+-------------* 
 | i1           | i2            | i3          | 
 +--------------+---------------+-------------+ 
 | 1-6 15 0:0:0 | 0-0 0 10:0:20 | 1-0 2 0:5:0 | 
 *--------------+---------------+-------------*/ 
 
 

