提交 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 {
result = ValueLong.get(datediff(v0.getString(), v1, v2));
break;
case DATE_TRUNC:
// Retrieve the field value (e.g. 'day', 'microseconds', etc.)
String fieldValue = StringUtils.toUpperEnglish(v0.getString());
// Retrieve the time unit (e.g. 'day', 'microseconds', etc.)
String timeUnit = StringUtils.toUpperEnglish(v0.getString());
// Retrieve the dateValue.
long[] fieldDateAndTime = DateTimeUtils.dateAndTimeFromValue(v1);
long fieldDateValue = fieldDateAndTime[0];
result = DateTimeUtils.truncateDate(timeUnit, v1);
// 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;
case EXTRACT: {
int field = getDatePart(v0.getString());
......
......@@ -1474,28 +1474,42 @@ public class DateTimeUtils {
/**
* Truncate the given date to 'day'
*
* @param timeUnit the time unit (e.g. 'DAY', 'HOUR', etc.)
* @param value the date
* @param dateValue the dateValue used if the value is not a timestamp time
* zone
* @return date truncated to 'day'
*/
public static Value truncateToDay(Value value, long dateValue) {
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());
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.
// datevalue to the datevalue 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;
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论