提交 c8cbfba5 authored 作者: Stéphane Eintrazi's avatar Stéphane Eintrazi

deplace all the code logic into a function

上级 a1fc874b
...@@ -1496,23 +1496,11 @@ public class Function extends Expression implements FunctionCall { ...@@ -1496,23 +1496,11 @@ public class Function extends Expression implements FunctionCall {
result = ValueLong.get(datediff(v0.getString(), v1, v2)); result = ValueLong.get(datediff(v0.getString(), v1, v2));
break; break;
case DATE_TRUNC: case DATE_TRUNC:
// Retrieve the field value (e.g. 'day', 'microseconds', etc.) // Retrieve the time unit (e.g. 'day', 'microseconds', etc.)
String fieldValue = StringUtils.toUpperEnglish(v0.getString()); String timeUnit = StringUtils.toUpperEnglish(v0.getString());
// Retrieve the dateValue. result = DateTimeUtils.truncateDate(timeUnit, v1);
long[] fieldDateAndTime = DateTimeUtils.dateAndTimeFromValue(v1);
long fieldDateValue = fieldDateAndTime[0];
// Case where the date has to be truncated to the day.
if (fieldValue.equals("DAY")) {
result = DateTimeUtils.truncateToDay(v1, fieldDateValue);
} else {
// Return an exception for the other possible value (not yet supported).
throw DbException.getUnsupportedException(v0.getString());
}
break; break;
case EXTRACT: { case EXTRACT: {
int field = getDatePart(v0.getString()); int field = getDatePart(v0.getString());
......
...@@ -1474,28 +1474,42 @@ public class DateTimeUtils { ...@@ -1474,28 +1474,42 @@ public class DateTimeUtils {
/** /**
* Truncate the given date to 'day' * Truncate the given date to 'day'
* *
* @param timeUnit the time unit (e.g. 'DAY', 'HOUR', etc.)
* @param value the date * @param value the date
* @param dateValue the dateValue used if the value is not a timestamp time
* zone
* @return date truncated to 'day' * @return date truncated to 'day'
*/ */
public static Value truncateToDay(Value value, long dateValue) { public static Value truncateDate(String timeUnit, Value value) {
Value result = null; Value result = null;
if (value instanceof ValueTimestampTimeZone) { // Retrieve the dateValue.
long[] fieldDateAndTime = DateTimeUtils.dateAndTimeFromValue(value);
long dateValue = fieldDateAndTime[0];
// Create a new ValueTimestampTimeZone by only setting the // Case where the date has to be truncated to the day.
// date. The time in nanoseconds since midnight will be set if (timeUnit.equals("DAY")) {
// to 0.
ValueTimestampTimeZone vTmp = (ValueTimestampTimeZone) value;
result = ValueTimestampTimeZone.fromDateValueAndNanos(vTmp.getDateValue(), 0, vTmp.getTimeZoneOffsetMins());
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
// datevalue to the datevalue retrieved and the time in
// nanoseconds since midnight to 0.
result = ValueTimestamp.fromDateValueAndNanos(dateValue, 0);
}
} else { } else {
// By default, we create a timestamp by setting the // Return an exception for the other possible value (not yet
// datevalue to the datevalue retrieved and the time in nanoseconds // supported).
// since midnight to 0. throw DbException.getUnsupportedException(timeUnit);
result = ValueTimestamp.fromDateValueAndNanos(dateValue, 0);
} }
return result; return result;
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论