Unverified 提交 5d46b1e0 authored 作者: Noel Grandin's avatar Noel Grandin 提交者: GitHub

Merge pull request #961 from ScaY/scay-issue#960

Add remaining "time unit" management in "date_trunc"
......@@ -18,7 +18,6 @@ import java.util.ArrayList;
import java.util.HashMap;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
import org.h2.api.ErrorCode;
import org.h2.command.Command;
import org.h2.command.Parser;
......@@ -108,7 +107,8 @@ public class Function extends Expression implements FunctionCall {
* Pseudo functions for DATEADD, DATEDIFF, and EXTRACT.
*/
public static final int MILLISECOND = 126, EPOCH = 127, MICROSECOND = 128, NANOSECOND = 129,
TIMEZONE_HOUR = 130, TIMEZONE_MINUTE = 131;
TIMEZONE_HOUR = 130, TIMEZONE_MINUTE = 131, DECADE = 132, CENTURY = 133,
MILLENNIUM = 134;
public static final int DATABASE = 150, USER = 151, CURRENT_USER = 152,
IDENTITY = 153, SCOPE_IDENTITY = 154, AUTOCOMMIT = 155,
......@@ -1437,11 +1437,7 @@ public class Function extends Expression implements FunctionCall {
result = ValueLong.get(DateTimeFunctions.datediff(v0.getString(), v1, v2));
break;
case DATE_TRUNC:
// Retrieve the time unit (e.g. 'day', 'microseconds', etc.)
String timeUnit = StringUtils.toUpperEnglish(v0.getString());
result = DateTimeUtils.truncateDate(timeUnit, v1);
result = DateTimeFunctions.truncateDate(v0.getString(), v1);
break;
case EXTRACT:
result = DateTimeFunctions.extract(v0.getString(), v1);
......
......@@ -5,15 +5,18 @@
*/
package org.h2.util;
import static org.h2.expression.Function.CENTURY;
import static org.h2.expression.Function.DAY_OF_MONTH;
import static org.h2.expression.Function.DAY_OF_WEEK;
import static org.h2.expression.Function.DAY_OF_YEAR;
import static org.h2.expression.Function.DECADE;
import static org.h2.expression.Function.EPOCH;
import static org.h2.expression.Function.HOUR;
import static org.h2.expression.Function.ISO_DAY_OF_WEEK;
import static org.h2.expression.Function.ISO_WEEK;
import static org.h2.expression.Function.ISO_YEAR;
import static org.h2.expression.Function.MICROSECOND;
import static org.h2.expression.Function.MILLENNIUM;
import static org.h2.expression.Function.MILLISECOND;
import static org.h2.expression.Function.MINUTE;
import static org.h2.expression.Function.MONTH;
......@@ -24,7 +27,6 @@ import static org.h2.expression.Function.TIMEZONE_HOUR;
import static org.h2.expression.Function.TIMEZONE_MINUTE;
import static org.h2.expression.Function.WEEK;
import static org.h2.expression.Function.YEAR;
import java.math.BigDecimal;
import java.text.DateFormatSymbols;
import java.text.SimpleDateFormat;
......@@ -32,7 +34,6 @@ import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.Locale;
import java.util.TimeZone;
import org.h2.api.ErrorCode;
import org.h2.expression.Function;
import org.h2.message.DbException;
......@@ -41,6 +42,7 @@ import org.h2.value.ValueDate;
import org.h2.value.ValueDecimal;
import org.h2.value.ValueInt;
import org.h2.value.ValueTime;
import org.h2.value.ValueTimestamp;
import org.h2.value.ValueTimestampTimeZone;
/**
......@@ -94,14 +96,19 @@ public final class DateTimeFunctions {
DATE_PART.put("SS", SECOND);
DATE_PART.put("S", SECOND);
DATE_PART.put("MILLISECOND", MILLISECOND);
DATE_PART.put("MILLISECONDS", MILLISECOND);
DATE_PART.put("MS", MILLISECOND);
DATE_PART.put("EPOCH", EPOCH);
DATE_PART.put("MICROSECOND", MICROSECOND);
DATE_PART.put("MICROSECONDS", MICROSECOND);
DATE_PART.put("MCS", MICROSECOND);
DATE_PART.put("NANOSECOND", NANOSECOND);
DATE_PART.put("NS", NANOSECOND);
DATE_PART.put("TIMEZONE_HOUR", TIMEZONE_HOUR);
DATE_PART.put("TIMEZONE_MINUTE", TIMEZONE_MINUTE);
DATE_PART.put("DECADE", DECADE);
DATE_PART.put("CENTURY", CENTURY);
DATE_PART.put("MILLENNIUM", MILLENNIUM);
}
/**
......@@ -374,6 +381,161 @@ public final class DateTimeFunctions {
return result;
}
/**
* Truncate the given date to the unit specified
*
* @param datePartStr the time unit (e.g. 'DAY', 'HOUR', etc.)
* @param value the date
* @return date truncated to 'day'
*/
public static Value truncateDate(String datePartStr, Value valueDate) {
int timeUnit = getDatePart(datePartStr);
// Retrieve the dateValue and the time in nanoseconds of the date.
long[] fieldDateAndTime = DateTimeUtils.dateAndTimeFromValue(valueDate);
long dateValue = fieldDateAndTime[0];
long timeNanosRetrieved = fieldDateAndTime[1];
// Variable used to the time in nanoseconds of the date truncated.
long timeNanos;
// Compute the number of time unit in the date, for example, the
// number of time unit 'HOUR' in '15:14:13' is '15'. Then convert the
// result to nanoseconds.
switch (timeUnit) {
case MICROSECOND:
long nanoInMicroSecond = 1_000L;
long microseconds = timeNanosRetrieved / nanoInMicroSecond;
timeNanos = microseconds * nanoInMicroSecond;
break;
case MILLISECOND:
long nanoInMilliSecond = 1_000_000L;
long milliseconds = timeNanosRetrieved / nanoInMilliSecond;
timeNanos = milliseconds * nanoInMilliSecond;
break;
case SECOND:
long nanoInSecond = 1_000_000_000L;
long seconds = timeNanosRetrieved / nanoInSecond;
timeNanos = seconds * nanoInSecond;
break;
case MINUTE:
long nanoInMinute = 60_000_000_000L;
long minutes = timeNanosRetrieved / nanoInMinute;
timeNanos = minutes * nanoInMinute;
break;
case HOUR:
long nanoInHour = 3_600_000_000_000L;
long hours = timeNanosRetrieved / nanoInHour;
timeNanos = hours * nanoInHour;
break;
case DAY_OF_MONTH:
timeNanos = 0L;
break;
case WEEK:
long absoluteDay = DateTimeUtils.absoluteDayFromDateValue(dateValue);
int dayOfWeek = DateTimeUtils.getDayOfWeekFromAbsolute(absoluteDay, 1);
if (dayOfWeek != 1) {
dateValue = DateTimeUtils.dateValueFromAbsoluteDay(absoluteDay - dayOfWeek + 1);
}
timeNanos = 0L;
break;
case MONTH: {
long year = DateTimeUtils.yearFromDateValue(dateValue);
int month = DateTimeUtils.monthFromDateValue(dateValue);
dateValue = DateTimeUtils.dateValue(year, month, 1);
timeNanos = 0L;
break;
}
case QUARTER: {
long year = DateTimeUtils.yearFromDateValue(dateValue);
int month = DateTimeUtils.monthFromDateValue(dateValue);
month = ((month - 1) / 3) * 3 + 1;
dateValue = DateTimeUtils.dateValue(year, month, 1);
timeNanos = 0L;
break;
}
case YEAR: {
long year = DateTimeUtils.yearFromDateValue(dateValue);
dateValue = DateTimeUtils.dateValue(year, 1, 1);
timeNanos = 0L;
break;
}
case DECADE: {
long year = DateTimeUtils.yearFromDateValue(dateValue);
year = (year / 10) * 10;
dateValue = DateTimeUtils.dateValue(year, 1, 1);
timeNanos = 0L;
break;
}
case CENTURY: {
long year = DateTimeUtils.yearFromDateValue(dateValue);
year = ((year - 1) / 100) * 100 + 1;
dateValue = DateTimeUtils.dateValue(year, 1, 1);
timeNanos = 0L;
break;
}
case MILLENNIUM: {
long year = DateTimeUtils.yearFromDateValue(dateValue);
year = ((year - 1) / 1000) * 1000 + 1;
dateValue = DateTimeUtils.dateValue(year, 1, 1);
timeNanos = 0L;
break;
}
default:
// Return an exception in the timeUnit is not recognized
throw DbException.getUnsupportedException(datePartStr);
}
Value result;
if (valueDate instanceof ValueTimestampTimeZone) {
// Case we create a timestamp with timezone with the dateValue and
// timeNanos computed.
ValueTimestampTimeZone vTmp = (ValueTimestampTimeZone) valueDate;
result = ValueTimestampTimeZone.fromDateValueAndNanos(dateValue, timeNanos, vTmp.getTimeZoneOffsetMins());
} else {
// By default, we create a timestamp with the dateValue and
// timeNanos computed.
result = ValueTimestamp.fromDateValueAndNanos(dateValue, timeNanos);
}
return result;
}
/**
* Formats a date using a format string.
*
......
......@@ -728,7 +728,7 @@ public class DateTimeUtils {
return getDayOfWeekFromAbsolute(absoluteDayFromDateValue(dateValue), firstDayOfWeek);
}
private static int getDayOfWeekFromAbsolute(long absoluteValue, int firstDayOfWeek) {
public static int getDayOfWeekFromAbsolute(long absoluteValue, int firstDayOfWeek) {
return absoluteValue >= 0 ? (int) ((absoluteValue - firstDayOfWeek + 11) % 7) + 1
: (int) ((absoluteValue - firstDayOfWeek - 2) % 7) + 7;
}
......@@ -1481,48 +1481,4 @@ public class DateTimeUtils {
return nanosOfDay - mod;
}
/**
* Truncate the given date to 'day'
*
* @param timeUnit the time unit (e.g. 'DAY', 'HOUR', etc.)
* @param value the date
* @return date truncated to 'day'
*/
public static Value truncateDate(String timeUnit, Value value) {
Value result = null;
// Retrieve the dateValue.
long[] fieldDateAndTime = DateTimeUtils.dateAndTimeFromValue(value);
long dateValue = fieldDateAndTime[0];
// Case where the date has to be truncated to the day.
if (timeUnit.equals("DAY")) {
if (value instanceof ValueTimestampTimeZone) {
// Create a new ValueTimestampTimeZone by only setting the
// date. The time in nanoseconds since midnight will be set
// to 0.
ValueTimestampTimeZone vTmp = (ValueTimestampTimeZone) value;
result = ValueTimestampTimeZone.fromDateValueAndNanos(vTmp.getDateValue(), 0,
vTmp.getTimeZoneOffsetMins());
} else {
// By default, we create a timestamp by setting the
// date value to the date value retrieved and the time in
// nanoseconds since midnight to 0.
result = ValueTimestamp.fromDateValueAndNanos(dateValue, 0);
}
} else {
// Return an exception for the other possible value (not yet
// supported).
throw DbException.getUnsupportedException(timeUnit);
}
return result;
}
}
......@@ -3,6 +3,553 @@
-- Initial Developer: H2 Group
--
--
-- Test time unit in 'MICROSECONDS'
--
SELECT DATE_TRUNC('MICROSECONDS', time '00:00:00.000');
>> 1970-01-01 00:00:00
SELECT DATE_TRUNC('microseconds', time '00:00:00.000');
>> 1970-01-01 00:00:00
SELECT DATE_TRUNC('MICROSECONDS', time '15:00:00');
>> 1970-01-01 15:00:00
SELECT DATE_TRUNC('microseconds', time '15:00:00');
>> 1970-01-01 15:00:00
SELECT DATE_TRUNC('MICROSECONDS', time '15:14:13');
>> 1970-01-01 15:14:13
SELECT DATE_TRUNC('microseconds', time '15:14:13');
>> 1970-01-01 15:14:13
SELECT DATE_TRUNC('MICROSECONDS', time '15:14:13.123456789');
>> 1970-01-01 15:14:13.123456
SELECT DATE_TRUNC('microseconds', time '15:14:13.123456789');
>> 1970-01-01 15:14:13.123456
SELECT DATE_TRUNC('MICROSECONDS', date '2015-05-29');
>> 2015-05-29 00:00:00
SELECT DATE_TRUNC('microseconds', date '2015-05-29');
>> 2015-05-29 00:00:00
SELECT DATE_TRUNC('MICROSECONDS', date '1970-01-01');
>> 1970-01-01 00:00:00
SELECT DATE_TRUNC('microseconds', date '1970-01-01');
>> 1970-01-01 00:00:00
select DATE_TRUNC('MICROSECONDS', timestamp with time zone '2015-05-29 15:14:13');
>> 2015-05-29 15:14:13+00
select DATE_TRUNC('microseconds', timestamp with time zone '2015-05-29 15:14:13');
>> 2015-05-29 15:14:13+00
select DATE_TRUNC('MICROSECONDS', timestamp with time zone '2015-05-29 15:14:13.123456789');
>> 2015-05-29 15:14:13.123456+00
select DATE_TRUNC('microseconds', timestamp with time zone '2015-05-29 15:14:13.123456789');
>> 2015-05-29 15:14:13.123456+00
select DATE_TRUNC('MICROSECONDS', timestamp with time zone '2015-05-29 15:14:13-06');
>> 2015-05-29 15:14:13-06
select DATE_TRUNC('microseconds', timestamp with time zone '2015-05-29 15:14:13-06');
>> 2015-05-29 15:14:13-06
select DATE_TRUNC('MICROSECONDS', timestamp with time zone '2015-05-29 15:14:13.123456789-06');
>> 2015-05-29 15:14:13.123456-06
select DATE_TRUNC('microseconds', timestamp with time zone '2015-05-29 15:14:13.123456789-06');
>> 2015-05-29 15:14:13.123456-06
select DATE_TRUNC('MICROSECONDS', timestamp with time zone '2015-05-29 15:14:13+10');
>> 2015-05-29 15:14:13+10
select DATE_TRUNC('microseconds', timestamp with time zone '2015-05-29 15:14:13+10');
>> 2015-05-29 15:14:13+10
select DATE_TRUNC('MICROSECONDS', timestamp with time zone '2015-05-29 15:14:13.123456789+10');
>> 2015-05-29 15:14:13.123456+10
select DATE_TRUNC('microseconds', timestamp with time zone '2015-05-29 15:14:13.123456789+10');
>> 2015-05-29 15:14:13.123456+10
SELECT DATE_TRUNC('microseconds', timestamp '2015-05-29 15:14:13');
>> 2015-05-29 15:14:13
SELECT DATE_TRUNC('MICROSECONDS', timestamp '2015-05-29 15:14:13');
>> 2015-05-29 15:14:13
SELECT DATE_TRUNC('microseconds', timestamp '2015-05-29 15:14:13.123456789');
>> 2015-05-29 15:14:13.123456
SELECT DATE_TRUNC('MICROSECONDS', timestamp '2015-05-29 15:14:13.123456789');
>> 2015-05-29 15:14:13.123456
SELECT DATE_TRUNC('microseconds', timestamp '2015-05-29 15:00:00');
>> 2015-05-29 15:00:00
SELECT DATE_TRUNC('MICROSECONDS', timestamp '2015-05-29 15:00:00');
>> 2015-05-29 15:00:00
SELECT DATE_TRUNC('microseconds', timestamp '2015-05-29 00:00:00');
>> 2015-05-29 00:00:00
SELECT DATE_TRUNC('MICROSECONDS', timestamp '2015-05-29 00:00:00');
>> 2015-05-29 00:00:00
SELECT DATE_TRUNC('microseconds', '2015-05-29 15:14:13');
>> 2015-05-29 15:14:13
SELECT DATE_TRUNC('MICROSECONDS', '2015-05-29 15:14:13');
>> 2015-05-29 15:14:13
SELECT DATE_TRUNC('microseconds', '2015-05-29 15:14:13.123456789');
>> 2015-05-29 15:14:13.123456
SELECT DATE_TRUNC('MICROSECONDS', '2015-05-29 15:14:13.123456789');
>> 2015-05-29 15:14:13.123456
SELECT DATE_TRUNC('microseconds', '2015-05-29 15:00:00');
>> 2015-05-29 15:00:00
SELECT DATE_TRUNC('MICROSECONDS', '2015-05-29 15:00:00');
>> 2015-05-29 15:00:00
SELECT DATE_TRUNC('microseconds', '2015-05-29 00:00:00');
>> 2015-05-29 00:00:00
SELECT DATE_TRUNC('MICROSECONDS', '2015-05-29 00:00:00');
>> 2015-05-29 00:00:00
--
-- Test time unit in 'MILLISECONDS'
--
SELECT DATE_TRUNC('MILLISECONDS', time '00:00:00.000');
>> 1970-01-01 00:00:00
SELECT DATE_TRUNC('milliseconds', time '00:00:00.000');
>> 1970-01-01 00:00:00
SELECT DATE_TRUNC('MILLISECONDS', time '15:00:00');
>> 1970-01-01 15:00:00
SELECT DATE_TRUNC('milliseconds', time '15:00:00');
>> 1970-01-01 15:00:00
SELECT DATE_TRUNC('MILLISECONDS', time '15:14:13');
>> 1970-01-01 15:14:13
SELECT DATE_TRUNC('milliseconds', time '15:14:13');
>> 1970-01-01 15:14:13
SELECT DATE_TRUNC('MILLISECONDS', time '15:14:13.123456');
>> 1970-01-01 15:14:13.123
SELECT DATE_TRUNC('milliseconds', time '15:14:13.123456');
>> 1970-01-01 15:14:13.123
SELECT DATE_TRUNC('MILLISECONDS', date '2015-05-29');
>> 2015-05-29 00:00:00
SELECT DATE_TRUNC('milliseconds', date '2015-05-29');
>> 2015-05-29 00:00:00
SELECT DATE_TRUNC('MILLISECONDS', date '1970-01-01');
>> 1970-01-01 00:00:00
SELECT DATE_TRUNC('milliseconds', date '1970-01-01');
>> 1970-01-01 00:00:00
select DATE_TRUNC('MILLISECONDS', timestamp with time zone '2015-05-29 15:14:13');
>> 2015-05-29 15:14:13+00
select DATE_TRUNC('milliseconds', timestamp with time zone '2015-05-29 15:14:13');
>> 2015-05-29 15:14:13+00
select DATE_TRUNC('MILLISECONDS', timestamp with time zone '2015-05-29 15:14:13.123456');
>> 2015-05-29 15:14:13.123+00
select DATE_TRUNC('milliseconds', timestamp with time zone '2015-05-29 15:14:13.123456');
>> 2015-05-29 15:14:13.123+00
select DATE_TRUNC('MILLISECONDS', timestamp with time zone '2015-05-29 15:14:13-06');
>> 2015-05-29 15:14:13-06
select DATE_TRUNC('milliseconds', timestamp with time zone '2015-05-29 15:14:13-06');
>> 2015-05-29 15:14:13-06
select DATE_TRUNC('MILLISECONDS', timestamp with time zone '2015-05-29 15:14:13.123456-06');
>> 2015-05-29 15:14:13.123-06
select DATE_TRUNC('milliseconds', timestamp with time zone '2015-05-29 15:14:13.123456-06');
>> 2015-05-29 15:14:13.123-06
select DATE_TRUNC('MILLISECONDS', timestamp with time zone '2015-05-29 15:14:13+10');
>> 2015-05-29 15:14:13+10
select DATE_TRUNC('milliseconds', timestamp with time zone '2015-05-29 15:14:13+10');
>> 2015-05-29 15:14:13+10
select DATE_TRUNC('MILLISECONDS', timestamp with time zone '2015-05-29 15:14:13.123456+10');
>> 2015-05-29 15:14:13.123+10
select DATE_TRUNC('milliseconds', timestamp with time zone '2015-05-29 15:14:13.123456+10');
>> 2015-05-29 15:14:13.123+10
SELECT DATE_TRUNC('milliseconds', timestamp '2015-05-29 15:14:13');
>> 2015-05-29 15:14:13
SELECT DATE_TRUNC('MILLISECONDS', timestamp '2015-05-29 15:14:13');
>> 2015-05-29 15:14:13
SELECT DATE_TRUNC('milliseconds', timestamp '2015-05-29 15:14:13.123456');
>> 2015-05-29 15:14:13.123
SELECT DATE_TRUNC('MILLISECONDS', timestamp '2015-05-29 15:14:13.123456');
>> 2015-05-29 15:14:13.123
SELECT DATE_TRUNC('milliseconds', timestamp '2015-05-29 15:00:00');
>> 2015-05-29 15:00:00
SELECT DATE_TRUNC('MILLISECONDS', timestamp '2015-05-29 15:00:00');
>> 2015-05-29 15:00:00
SELECT DATE_TRUNC('milliseconds', timestamp '2015-05-29 00:00:00');
>> 2015-05-29 00:00:00
SELECT DATE_TRUNC('MILLISECONDS', timestamp '2015-05-29 00:00:00');
>> 2015-05-29 00:00:00
SELECT DATE_TRUNC('milliseconds', '2015-05-29 15:14:13');
>> 2015-05-29 15:14:13
SELECT DATE_TRUNC('MILLISECONDS', '2015-05-29 15:14:13');
>> 2015-05-29 15:14:13
SELECT DATE_TRUNC('milliseconds', '2015-05-29 15:14:13.123456');
>> 2015-05-29 15:14:13.123
SELECT DATE_TRUNC('MILLISECONDS', '2015-05-29 15:14:13.123456');
>> 2015-05-29 15:14:13.123
SELECT DATE_TRUNC('milliseconds', '2015-05-29 15:00:00');
>> 2015-05-29 15:00:00
SELECT DATE_TRUNC('MILLISECONDS', '2015-05-29 15:00:00');
>> 2015-05-29 15:00:00
SELECT DATE_TRUNC('milliseconds', '2015-05-29 00:00:00');
>> 2015-05-29 00:00:00
SELECT DATE_TRUNC('MILLISECONDS', '2015-05-29 00:00:00');
>> 2015-05-29 00:00:00
--
-- Test time unit 'SECOND'
--
SELECT DATE_TRUNC('SECOND', time '00:00:00.000');
>> 1970-01-01 00:00:00
SELECT DATE_TRUNC('second', time '00:00:00.000');
>> 1970-01-01 00:00:00
SELECT DATE_TRUNC('SECOND', time '15:00:00');
>> 1970-01-01 15:00:00
SELECT DATE_TRUNC('second', time '15:00:00');
>> 1970-01-01 15:00:00
SELECT DATE_TRUNC('SECOND', time '15:14:13');
>> 1970-01-01 15:14:13
SELECT DATE_TRUNC('second', time '15:14:13');
>> 1970-01-01 15:14:13
SELECT DATE_TRUNC('SECOND', time '15:14:13.123456');
>> 1970-01-01 15:14:13
SELECT DATE_TRUNC('second', time '15:14:13.123456');
>> 1970-01-01 15:14:13
SELECT DATE_TRUNC('SECOND', date '2015-05-29');
>> 2015-05-29 00:00:00
SELECT DATE_TRUNC('second', date '2015-05-29');
>> 2015-05-29 00:00:00
SELECT DATE_TRUNC('SECOND', date '1970-01-01');
>> 1970-01-01 00:00:00
SELECT DATE_TRUNC('second', date '1970-01-01');
>> 1970-01-01 00:00:00
select DATE_TRUNC('SECOND', timestamp with time zone '2015-05-29 15:14:13');
>> 2015-05-29 15:14:13+00
select DATE_TRUNC('second', timestamp with time zone '2015-05-29 15:14:13');
>> 2015-05-29 15:14:13+00
select DATE_TRUNC('SECOND', timestamp with time zone '2015-05-29 15:14:13.123456');
>> 2015-05-29 15:14:13+00
select DATE_TRUNC('second', timestamp with time zone '2015-05-29 15:14:13.123456');
>> 2015-05-29 15:14:13+00
select DATE_TRUNC('SECOND', timestamp with time zone '2015-05-29 15:14:13-06');
>> 2015-05-29 15:14:13-06
select DATE_TRUNC('second', timestamp with time zone '2015-05-29 15:14:13-06');
>> 2015-05-29 15:14:13-06
select DATE_TRUNC('SECOND', timestamp with time zone '2015-05-29 15:14:13.123456-06');
>> 2015-05-29 15:14:13-06
select DATE_TRUNC('second', timestamp with time zone '2015-05-29 15:14:13.123456-06');
>> 2015-05-29 15:14:13-06
select DATE_TRUNC('SECOND', timestamp with time zone '2015-05-29 15:14:13+10');
>> 2015-05-29 15:14:13+10
select DATE_TRUNC('second', timestamp with time zone '2015-05-29 15:14:13+10');
>> 2015-05-29 15:14:13+10
select DATE_TRUNC('SECOND', timestamp with time zone '2015-05-29 15:14:13.123456+10');
>> 2015-05-29 15:14:13+10
select DATE_TRUNC('second', timestamp with time zone '2015-05-29 15:14:13.123456+10');
>> 2015-05-29 15:14:13+10
SELECT DATE_TRUNC('second', timestamp '2015-05-29 15:14:13');
>> 2015-05-29 15:14:13
SELECT DATE_TRUNC('SECOND', timestamp '2015-05-29 15:14:13');
>> 2015-05-29 15:14:13
SELECT DATE_TRUNC('second', timestamp '2015-05-29 15:14:13.123456');
>> 2015-05-29 15:14:13
SELECT DATE_TRUNC('SECOND', timestamp '2015-05-29 15:14:13.123456');
>> 2015-05-29 15:14:13
SELECT DATE_TRUNC('second', timestamp '2015-05-29 15:00:00');
>> 2015-05-29 15:00:00
SELECT DATE_TRUNC('SECOND', timestamp '2015-05-29 15:00:00');
>> 2015-05-29 15:00:00
SELECT DATE_TRUNC('second', timestamp '2015-05-29 00:00:00');
>> 2015-05-29 00:00:00
SELECT DATE_TRUNC('SECOND', timestamp '2015-05-29 00:00:00');
>> 2015-05-29 00:00:00
SELECT DATE_TRUNC('second', '2015-05-29 15:14:13');
>> 2015-05-29 15:14:13
SELECT DATE_TRUNC('SECOND', '2015-05-29 15:14:13');
>> 2015-05-29 15:14:13
SELECT DATE_TRUNC('second', '2015-05-29 15:14:13.123456');
>> 2015-05-29 15:14:13
SELECT DATE_TRUNC('SECOND', '2015-05-29 15:14:13.123456');
>> 2015-05-29 15:14:13
SELECT DATE_TRUNC('second', '2015-05-29 15:00:00');
>> 2015-05-29 15:00:00
SELECT DATE_TRUNC('SECOND', '2015-05-29 15:00:00');
>> 2015-05-29 15:00:00
SELECT DATE_TRUNC('second', '2015-05-29 00:00:00');
>> 2015-05-29 00:00:00
SELECT DATE_TRUNC('SECOND', '2015-05-29 00:00:00');
>> 2015-05-29 00:00:00
--
-- Test time unit 'MINUTE'
--
SELECT DATE_TRUNC('MINUTE', time '00:00:00');
>> 1970-01-01 00:00:00
SELECT DATE_TRUNC('minute', time '00:00:00');
>> 1970-01-01 00:00:00
SELECT DATE_TRUNC('MINUTE', time '15:00:00');
>> 1970-01-01 15:00:00
SELECT DATE_TRUNC('minute', time '15:00:00');
>> 1970-01-01 15:00:00
SELECT DATE_TRUNC('MINUTE', time '15:14:13');
>> 1970-01-01 15:14:00
SELECT DATE_TRUNC('minute', time '15:14:13');
>> 1970-01-01 15:14:00
SELECT DATE_TRUNC('MINUTE', date '2015-05-29');
>> 2015-05-29 00:00:00
SELECT DATE_TRUNC('minute', date '2015-05-29');
>> 2015-05-29 00:00:00
SELECT DATE_TRUNC('MINUTE', date '1970-01-01');
>> 1970-01-01 00:00:00
SELECT DATE_TRUNC('minute', date '1970-01-01');
>> 1970-01-01 00:00:00
select DATE_TRUNC('MINUTE', timestamp with time zone '2015-05-29 15:14:13');
>> 2015-05-29 15:14:00+00
select DATE_TRUNC('minute', timestamp with time zone '2015-05-29 15:14:13');
>> 2015-05-29 15:14:00+00
select DATE_TRUNC('MINUTE', timestamp with time zone '2015-05-29 15:14:13-06');
>> 2015-05-29 15:14:00-06
select DATE_TRUNC('minute', timestamp with time zone '2015-05-29 15:14:13-06');
>> 2015-05-29 15:14:00-06
select DATE_TRUNC('MINUTE', timestamp with time zone '2015-05-29 15:14:13+10');
>> 2015-05-29 15:14:00+10
select DATE_TRUNC('minute', timestamp with time zone '2015-05-29 15:14:13+10');
>> 2015-05-29 15:14:00+10
SELECT DATE_TRUNC('minute', timestamp '2015-05-29 15:14:13');
>> 2015-05-29 15:14:00
SELECT DATE_TRUNC('MINUTE', timestamp '2015-05-29 15:14:13');
>> 2015-05-29 15:14:00
SELECT DATE_TRUNC('minute', timestamp '2015-05-29 15:00:00');
>> 2015-05-29 15:00:00
SELECT DATE_TRUNC('MINUTE', timestamp '2015-05-29 15:00:00');
>> 2015-05-29 15:00:00
SELECT DATE_TRUNC('minute', timestamp '2015-05-29 00:00:00');
>> 2015-05-29 00:00:00
SELECT DATE_TRUNC('MINUTE', timestamp '2015-05-29 00:00:00');
>> 2015-05-29 00:00:00
SELECT DATE_TRUNC('minute', '2015-05-29 15:14:13');
>> 2015-05-29 15:14:00
SELECT DATE_TRUNC('MINUTE', '2015-05-29 15:14:13');
>> 2015-05-29 15:14:00
SELECT DATE_TRUNC('minute', '2015-05-29 15:00:00');
>> 2015-05-29 15:00:00
SELECT DATE_TRUNC('MINUTE', '2015-05-29 15:00:00');
>> 2015-05-29 15:00:00
SELECT DATE_TRUNC('minute', '2015-05-29 00:00:00');
>> 2015-05-29 00:00:00
SELECT DATE_TRUNC('MINUTE', '2015-05-29 00:00:00');
>> 2015-05-29 00:00:00
--
-- Test time unit 'HOUR'
--
SELECT DATE_TRUNC('HOUR', time '00:00:00');
>> 1970-01-01 00:00:00
SELECT DATE_TRUNC('hour', time '00:00:00');
>> 1970-01-01 00:00:00
SELECT DATE_TRUNC('HOUR', time '15:00:00');
>> 1970-01-01 15:00:00
SELECT DATE_TRUNC('hour', time '15:00:00');
>> 1970-01-01 15:00:00
SELECT DATE_TRUNC('HOUR', time '15:14:13');
>> 1970-01-01 15:00:00
SELECT DATE_TRUNC('hour', time '15:14:13');
>> 1970-01-01 15:00:00
SELECT DATE_TRUNC('HOUR', date '2015-05-29');
>> 2015-05-29 00:00:00
SELECT DATE_TRUNC('hour', date '2015-05-29');
>> 2015-05-29 00:00:00
SELECT DATE_TRUNC('HOUR', date '1970-01-01');
>> 1970-01-01 00:00:00
SELECT DATE_TRUNC('hour', date '1970-01-01');
>> 1970-01-01 00:00:00
select DATE_TRUNC('HOUR', timestamp with time zone '2015-05-29 15:14:13');
>> 2015-05-29 15:00:00+00
select DATE_TRUNC('hour', timestamp with time zone '2015-05-29 15:14:13');
>> 2015-05-29 15:00:00+00
select DATE_TRUNC('HOUR', timestamp with time zone '2015-05-29 15:14:13-06');
>> 2015-05-29 15:00:00-06
select DATE_TRUNC('hour', timestamp with time zone '2015-05-29 15:14:13-06');
>> 2015-05-29 15:00:00-06
select DATE_TRUNC('HOUR', timestamp with time zone '2015-05-29 15:14:13+10');
>> 2015-05-29 15:00:00+10
select DATE_TRUNC('hour', timestamp with time zone '2015-05-29 15:14:13+10');
>> 2015-05-29 15:00:00+10
SELECT DATE_TRUNC('hour', timestamp '2015-05-29 15:14:13');
>> 2015-05-29 15:00:00
SELECT DATE_TRUNC('HOUR', timestamp '2015-05-29 15:14:13');
>> 2015-05-29 15:00:00
SELECT DATE_TRUNC('hour', timestamp '2015-05-29 15:00:00');
>> 2015-05-29 15:00:00
SELECT DATE_TRUNC('HOUR', timestamp '2015-05-29 15:00:00');
>> 2015-05-29 15:00:00
SELECT DATE_TRUNC('hour', timestamp '2015-05-29 00:00:00');
>> 2015-05-29 00:00:00
SELECT DATE_TRUNC('HOUR', timestamp '2015-05-29 00:00:00');
>> 2015-05-29 00:00:00
SELECT DATE_TRUNC('hour', '2015-05-29 15:14:13');
>> 2015-05-29 15:00:00
SELECT DATE_TRUNC('HOUR', '2015-05-29 15:14:13');
>> 2015-05-29 15:00:00
SELECT DATE_TRUNC('hour', '2015-05-29 15:00:00');
>> 2015-05-29 15:00:00
SELECT DATE_TRUNC('HOUR', '2015-05-29 15:00:00');
>> 2015-05-29 15:00:00
SELECT DATE_TRUNC('hour', '2015-05-29 00:00:00');
>> 2015-05-29 00:00:00
SELECT DATE_TRUNC('HOUR', '2015-05-29 00:00:00');
>> 2015-05-29 00:00:00
--
-- Test time unit 'DAY'
--
select DATE_TRUNC('day', time '00:00:00');
>> 1970-01-01 00:00:00
......@@ -51,77 +598,479 @@ select DATE_TRUNC('day', '2015-05-29 15:14:13');
select DATE_TRUNC('DAY', '2015-05-29 15:14:13');
>> 2015-05-29 00:00:00
SELECT DATE_TRUNC('---', '2015-05-29 15:14:13');
> exception
SELECT DATE_TRUNC('microseconds', '2015-05-29 15:14:13');
> exception
--
-- Test time unit 'WEEK'
--
select DATE_TRUNC('week', time '00:00:00');
>> 1969-12-29 00:00:00
SELECT DATE_TRUNC('MICROSECONDS', '2015-05-29 15:14:13');
> exception
select DATE_TRUNC('WEEK', time '00:00:00');
>> 1969-12-29 00:00:00
SELECT DATE_TRUNC('milliseconds', '2015-05-29 15:14:13');
> exception
select DATE_TRUNC('week', time '15:14:13');
>> 1969-12-29 00:00:00
SELECT DATE_TRUNC('MILLISECONDS', '2015-05-29 15:14:13');
> exception
select DATE_TRUNC('WEEK', time '15:14:13');
>> 1969-12-29 00:00:00
SELECT DATE_TRUNC('second', '2015-05-29 15:14:13');
> exception
select DATE_TRUNC('week', date '2015-05-28');
>> 2015-05-25 00:00:00
SELECT DATE_TRUNC('SECOND', '2015-05-29 15:14:13');
> exception
select DATE_TRUNC('WEEK', date '2015-05-28');
>> 2015-05-25 00:00:00
SELECT DATE_TRUNC('minute', '2015-05-29 15:14:13');
> exception
select DATE_TRUNC('week', timestamp '2015-05-29 15:14:13');
>> 2015-05-25 00:00:00
SELECT DATE_TRUNC('MINUTE', '2015-05-29 15:14:13');
> exception
select DATE_TRUNC('WEEK', timestamp '2015-05-29 15:14:13');
>> 2015-05-25 00:00:00
SELECT DATE_TRUNC('hour', '2015-05-29 15:14:13');
> exception
select DATE_TRUNC('week', timestamp with time zone '2015-05-29 15:14:13');
>> 2015-05-25 00:00:00+00
SELECT DATE_TRUNC('HOUR', '2015-05-29 15:14:13');
> exception
select DATE_TRUNC('WEEK', timestamp with time zone '2015-05-29 15:14:13');
>> 2015-05-25 00:00:00+00
SELECT DATE_TRUNC('week', '2015-05-29 15:14:13');
> exception
select DATE_TRUNC('week', timestamp with time zone '2015-05-29 05:14:13-06');
>> 2015-05-25 00:00:00-06
SELECT DATE_TRUNC('WEEK', '2015-05-29 15:14:13');
> exception
select DATE_TRUNC('WEEK', timestamp with time zone '2015-05-29 05:14:13-06');
>> 2015-05-25 00:00:00-06
select DATE_TRUNC('week', timestamp with time zone '2015-05-29 15:14:13+10');
>> 2015-05-25 00:00:00+10
select DATE_TRUNC('WEEK', timestamp with time zone '2015-05-29 15:14:13+10');
>> 2015-05-25 00:00:00+10
select DATE_TRUNC('week', '2015-05-29 15:14:13');
>> 2015-05-25 00:00:00
select DATE_TRUNC('WEEK', '2015-05-29 15:14:13');
>> 2015-05-25 00:00:00
SELECT DATE_TRUNC('WEEK', '2018-03-14 00:00:00.000');
>> 2018-03-12 00:00:00
SELECT DATE_TRUNC('week', '2018-03-14 00:00:00.000');
>> 2018-03-12 00:00:00
--
-- Test time unit 'MONTH'
--
select DATE_TRUNC('month', time '00:00:00');
>> 1970-01-01 00:00:00
select DATE_TRUNC('MONTH', time '00:00:00');
>> 1970-01-01 00:00:00
select DATE_TRUNC('month', time '15:14:13');
>> 1970-01-01 00:00:00
select DATE_TRUNC('MONTH', time '15:14:13');
>> 1970-01-01 00:00:00
select DATE_TRUNC('month', date '2015-05-28');
>> 2015-05-01 00:00:00
select DATE_TRUNC('MONTH', date '2015-05-28');
>> 2015-05-01 00:00:00
select DATE_TRUNC('month', timestamp '2015-05-29 15:14:13');
>> 2015-05-01 00:00:00
select DATE_TRUNC('MONTH', timestamp '2015-05-29 15:14:13');
>> 2015-05-01 00:00:00
select DATE_TRUNC('month', timestamp with time zone '2015-05-29 15:14:13');
>> 2015-05-01 00:00:00+00
select DATE_TRUNC('MONTH', timestamp with time zone '2015-05-29 15:14:13');
>> 2015-05-01 00:00:00+00
select DATE_TRUNC('month', timestamp with time zone '2015-05-29 05:14:13-06');
>> 2015-05-01 00:00:00-06
select DATE_TRUNC('MONTH', timestamp with time zone '2015-05-29 05:14:13-06');
>> 2015-05-01 00:00:00-06
select DATE_TRUNC('month', timestamp with time zone '2015-05-29 15:14:13+10');
>> 2015-05-01 00:00:00+10
select DATE_TRUNC('MONTH', timestamp with time zone '2015-05-29 15:14:13+10');
>> 2015-05-01 00:00:00+10
select DATE_TRUNC('month', '2015-05-29 15:14:13');
>> 2015-05-01 00:00:00
select DATE_TRUNC('MONTH', '2015-05-29 15:14:13');
>> 2015-05-01 00:00:00
SELECT DATE_TRUNC('MONTH', '2018-03-14 00:00:00.000');
>> 2018-03-01 00:00:00
SELECT DATE_TRUNC('month', '2018-03-14 00:00:00.000');
>> 2018-03-01 00:00:00
SELECT DATE_TRUNC('month', '2015-05-29 15:14:13');
> exception
>> 2015-05-01 00:00:00
SELECT DATE_TRUNC('MONTH', '2015-05-29 15:14:13');
> exception
>> 2015-05-01 00:00:00
SELECT DATE_TRUNC('month', '2015-05-01 15:14:13');
>> 2015-05-01 00:00:00
SELECT DATE_TRUNC('MONTH', '2015-05-01 15:14:13');
>> 2015-05-01 00:00:00
--
-- Test time unit 'QUARTER'
--
select DATE_TRUNC('quarter', time '00:00:00');
>> 1970-01-01 00:00:00
select DATE_TRUNC('QUARTER', time '00:00:00');
>> 1970-01-01 00:00:00
select DATE_TRUNC('quarter', time '15:14:13');
>> 1970-01-01 00:00:00
select DATE_TRUNC('QUARTER', time '15:14:13');
>> 1970-01-01 00:00:00
select DATE_TRUNC('quarter', date '2015-05-28');
>> 2015-04-01 00:00:00
select DATE_TRUNC('QUARTER', date '2015-05-28');
>> 2015-04-01 00:00:00
select DATE_TRUNC('quarter', timestamp '2015-05-29 15:14:13');
>> 2015-04-01 00:00:00
select DATE_TRUNC('QUARTER', timestamp '2015-05-29 15:14:13');
>> 2015-04-01 00:00:00
select DATE_TRUNC('quarter', timestamp with time zone '2015-05-29 15:14:13');
>> 2015-04-01 00:00:00+00
select DATE_TRUNC('QUARTER', timestamp with time zone '2015-05-29 15:14:13');
>> 2015-04-01 00:00:00+00
select DATE_TRUNC('quarter', timestamp with time zone '2015-05-29 05:14:13-06');
>> 2015-04-01 00:00:00-06
select DATE_TRUNC('QUARTER', timestamp with time zone '2015-05-29 05:14:13-06');
>> 2015-04-01 00:00:00-06
select DATE_TRUNC('quarter', timestamp with time zone '2015-05-29 15:14:13+10');
>> 2015-04-01 00:00:00+10
select DATE_TRUNC('QUARTER', timestamp with time zone '2015-05-29 15:14:13+10');
>> 2015-04-01 00:00:00+10
select DATE_TRUNC('quarter', '2015-05-29 15:14:13');
>> 2015-04-01 00:00:00
select DATE_TRUNC('QUARTER', '2015-05-29 15:14:13');
>> 2015-04-01 00:00:00
SELECT DATE_TRUNC('QUARTER', '2018-03-14 00:00:00.000');
>> 2018-01-01 00:00:00
SELECT DATE_TRUNC('quarter', '2018-03-14 00:00:00.000');
>> 2018-01-01 00:00:00
SELECT DATE_TRUNC('quarter', '2015-05-29 15:14:13');
> exception
>> 2015-04-01 00:00:00
SELECT DATE_TRUNC('QUARTER', '2015-05-29 15:14:13');
> exception
>> 2015-04-01 00:00:00
SELECT DATE_TRUNC('quarter', '2015-05-01 15:14:13');
>> 2015-04-01 00:00:00
SELECT DATE_TRUNC('QUARTER', '2015-05-01 15:14:13');
>> 2015-04-01 00:00:00
SELECT DATE_TRUNC('quarter', '2015-07-29 15:14:13');
>> 2015-07-01 00:00:00
SELECT DATE_TRUNC('QUARTER', '2015-07-29 15:14:13');
>> 2015-07-01 00:00:00
SELECT DATE_TRUNC('quarter', '2015-09-29 15:14:13');
>> 2015-07-01 00:00:00
SELECT DATE_TRUNC('QUARTER', '2015-09-29 15:14:13');
>> 2015-07-01 00:00:00
SELECT DATE_TRUNC('quarter', '2015-10-29 15:14:13');
>> 2015-10-01 00:00:00
SELECT DATE_TRUNC('QUARTER', '2015-10-29 15:14:13');
>> 2015-10-01 00:00:00
SELECT DATE_TRUNC('quarter', '2015-12-29 15:14:13');
>> 2015-10-01 00:00:00
SELECT DATE_TRUNC('QUARTER', '2015-12-29 15:14:13');
>> 2015-10-01 00:00:00
--
-- Test time unit 'YEAR'
--
select DATE_TRUNC('year', time '00:00:00');
>> 1970-01-01 00:00:00
select DATE_TRUNC('YEAR', time '00:00:00');
>> 1970-01-01 00:00:00
select DATE_TRUNC('year', time '15:14:13');
>> 1970-01-01 00:00:00
select DATE_TRUNC('YEAR', time '15:14:13');
>> 1970-01-01 00:00:00
select DATE_TRUNC('year', date '2015-05-28');
>> 2015-01-01 00:00:00
select DATE_TRUNC('YEAR', date '2015-05-28');
>> 2015-01-01 00:00:00
select DATE_TRUNC('year', timestamp '2015-05-29 15:14:13');
>> 2015-01-01 00:00:00
select DATE_TRUNC('YEAR', timestamp '2015-05-29 15:14:13');
>> 2015-01-01 00:00:00
select DATE_TRUNC('year', timestamp with time zone '2015-05-29 15:14:13');
>> 2015-01-01 00:00:00+00
select DATE_TRUNC('YEAR', timestamp with time zone '2015-05-29 15:14:13');
>> 2015-01-01 00:00:00+00
select DATE_TRUNC('year', timestamp with time zone '2015-05-29 05:14:13-06');
>> 2015-01-01 00:00:00-06
select DATE_TRUNC('YEAR', timestamp with time zone '2015-05-29 05:14:13-06');
>> 2015-01-01 00:00:00-06
select DATE_TRUNC('year', timestamp with time zone '2015-05-29 15:14:13+10');
>> 2015-01-01 00:00:00+10
select DATE_TRUNC('YEAR', timestamp with time zone '2015-05-29 15:14:13+10');
>> 2015-01-01 00:00:00+10
SELECT DATE_TRUNC('year', '2015-05-29 15:14:13');
> exception
>> 2015-01-01 00:00:00
SELECT DATE_TRUNC('YEAR', '2015-05-29 15:14:13');
> exception
>> 2015-01-01 00:00:00
--
-- Test time unit 'DECADE'
--
select DATE_TRUNC('decade', time '00:00:00');
>> 1970-01-01 00:00:00
select DATE_TRUNC('DECADE', time '00:00:00');
>> 1970-01-01 00:00:00
select DATE_TRUNC('decade', time '15:14:13');
>> 1970-01-01 00:00:00
select DATE_TRUNC('DECADE', time '15:14:13');
>> 1970-01-01 00:00:00
select DATE_TRUNC('decade', date '2015-05-28');
>> 2010-01-01 00:00:00
select DATE_TRUNC('DECADE', date '2015-05-28');
>> 2010-01-01 00:00:00
select DATE_TRUNC('decade', timestamp '2015-05-29 15:14:13');
>> 2010-01-01 00:00:00
select DATE_TRUNC('DECADE', timestamp '2015-05-29 15:14:13');
>> 2010-01-01 00:00:00
select DATE_TRUNC('decade', timestamp with time zone '2015-05-29 15:14:13');
>> 2010-01-01 00:00:00+00
select DATE_TRUNC('DECADE', timestamp with time zone '2015-05-29 15:14:13');
>> 2010-01-01 00:00:00+00
select DATE_TRUNC('decade', timestamp with time zone '2015-05-29 05:14:13-06');
>> 2010-01-01 00:00:00-06
select DATE_TRUNC('DECADE', timestamp with time zone '2015-05-29 05:14:13-06');
>> 2010-01-01 00:00:00-06
select DATE_TRUNC('decade', timestamp with time zone '2015-05-29 15:14:13+10');
>> 2010-01-01 00:00:00+10
select DATE_TRUNC('DECADE', timestamp with time zone '2015-05-29 15:14:13+10');
>> 2010-01-01 00:00:00+10
SELECT DATE_TRUNC('decade', '2015-05-29 15:14:13');
> exception
>> 2010-01-01 00:00:00
SELECT DATE_TRUNC('DECADE', '2015-05-29 15:14:13');
> exception
>> 2010-01-01 00:00:00
SELECT DATE_TRUNC('decade', '2010-05-29 15:14:13');
>> 2010-01-01 00:00:00
SELECT DATE_TRUNC('DECADE', '2010-05-29 15:14:13');
>> 2010-01-01 00:00:00
--
-- Test time unit 'CENTURY'
--
select DATE_TRUNC('century', time '00:00:00');
>> 1901-01-01 00:00:00
select DATE_TRUNC('CENTURY', time '00:00:00');
>> 1901-01-01 00:00:00
select DATE_TRUNC('century', time '15:14:13');
>> 1901-01-01 00:00:00
select DATE_TRUNC('CENTURY', time '15:14:13');
>> 1901-01-01 00:00:00
select DATE_TRUNC('century', date '2015-05-28');
>> 2001-01-01 00:00:00
select DATE_TRUNC('CENTURY', date '2015-05-28');
>> 2001-01-01 00:00:00
select DATE_TRUNC('century', timestamp '2015-05-29 15:14:13');
>> 2001-01-01 00:00:00
select DATE_TRUNC('CENTURY', timestamp '2015-05-29 15:14:13');
>> 2001-01-01 00:00:00
select DATE_TRUNC('century', timestamp with time zone '2015-05-29 15:14:13');
>> 2001-01-01 00:00:00+00
select DATE_TRUNC('CENTURY', timestamp with time zone '2015-05-29 15:14:13');
>> 2001-01-01 00:00:00+00
select DATE_TRUNC('century', timestamp with time zone '2015-05-29 05:14:13-06');
>> 2001-01-01 00:00:00-06
select DATE_TRUNC('CENTURY', timestamp with time zone '2015-05-29 05:14:13-06');
>> 2001-01-01 00:00:00-06
select DATE_TRUNC('century', timestamp with time zone '2015-05-29 15:14:13+10');
>> 2001-01-01 00:00:00+10
select DATE_TRUNC('CENTURY', timestamp with time zone '2015-05-29 15:14:13+10');
>> 2001-01-01 00:00:00+10
SELECT DATE_TRUNC('century', '2015-05-29 15:14:13');
> exception
>> 2001-01-01 00:00:00
SELECT DATE_TRUNC('CENTURY', '2015-05-29 15:14:13');
> exception
>> 2001-01-01 00:00:00
SELECT DATE_TRUNC('century', '2199-05-29 15:14:13');
>> 2101-01-01 00:00:00
SELECT DATE_TRUNC('CENTURY', '2199-05-29 15:14:13');
>> 2101-01-01 00:00:00
SELECT DATE_TRUNC('century', '2000-05-29 15:14:13');
>> 1901-01-01 00:00:00
SELECT DATE_TRUNC('CENTURY', '2000-05-29 15:14:13');
>> 1901-01-01 00:00:00
SELECT DATE_TRUNC('century', '2001-05-29 15:14:13');
>> 2001-01-01 00:00:00
SELECT DATE_TRUNC('CENTURY', '2001-05-29 15:14:13');
>> 2001-01-01 00:00:00
--
-- Test time unit 'MILLENNIUM'
--
select DATE_TRUNC('millennium', time '00:00:00');
>> 1001-01-01 00:00:00
select DATE_TRUNC('MILLENNIUM', time '00:00:00');
>> 1001-01-01 00:00:00
select DATE_TRUNC('millennium', time '15:14:13');
>> 1001-01-01 00:00:00
select DATE_TRUNC('MILLENNIUM', time '15:14:13');
>> 1001-01-01 00:00:00
select DATE_TRUNC('millennium', date '2015-05-28');
>> 2001-01-01 00:00:00
select DATE_TRUNC('MILLENNIUM', date '2015-05-28');
>> 2001-01-01 00:00:00
select DATE_TRUNC('millennium', timestamp '2015-05-29 15:14:13');
>> 2001-01-01 00:00:00
select DATE_TRUNC('MILLENNIUM', timestamp '2015-05-29 15:14:13');
>> 2001-01-01 00:00:00
select DATE_TRUNC('millennium', timestamp with time zone '2015-05-29 15:14:13');
>> 2001-01-01 00:00:00+00
select DATE_TRUNC('MILLENNIUM', timestamp with time zone '2015-05-29 15:14:13');
>> 2001-01-01 00:00:00+00
select DATE_TRUNC('millennium', timestamp with time zone '2015-05-29 05:14:13-06');
>> 2001-01-01 00:00:00-06
select DATE_TRUNC('MILLENNIUM', timestamp with time zone '2015-05-29 05:14:13-06');
>> 2001-01-01 00:00:00-06
select DATE_TRUNC('millennium', timestamp with time zone '2015-05-29 15:14:13+10');
>> 2001-01-01 00:00:00+10
select DATE_TRUNC('MILLENNIUM', timestamp with time zone '2015-05-29 15:14:13+10');
>> 2001-01-01 00:00:00+10
SELECT DATE_TRUNC('millennium', '2015-05-29 15:14:13');
> exception
>> 2001-01-01 00:00:00
SELECT DATE_TRUNC('MILLENNIUM', '2015-05-29 15:14:13');
>> 2001-01-01 00:00:00
SELECT DATE_TRUNC('millennium', '2001-05-29 15:14:13');
>> 2001-01-01 00:00:00
SELECT DATE_TRUNC('MILLENNIUM', '2001-05-29 15:14:13');
>> 2001-01-01 00:00:00
SELECT DATE_TRUNC('millennium', '2000-05-29 15:14:13');
>> 1001-01-01 00:00:00
SELECT DATE_TRUNC('MILLENNIUM', '2000-05-29 15:14:13');
>> 1001-01-01 00:00:00
--
-- Test unhandled time unit and bad date
--
SELECT DATE_TRUNC('---', '2015-05-29 15:14:13');
> exception
SELECT DATE_TRUNC('', '2015-05-29 15:14:13');
> exception
SELECT DATE_TRUNC('', '');
> exception
SELECT DATE_TRUNC('YEAR', '');
> exception
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论