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

refractor the code to a function in DateTimeUtils

上级 66cc269e
...@@ -1506,26 +1506,11 @@ public class Function extends Expression implements FunctionCall { ...@@ -1506,26 +1506,11 @@ public class Function extends Expression implements FunctionCall {
// Case where the date has to be truncated to the day. // Case where the date has to be truncated to the day.
if (fieldValue.equals("DAY")) { if (fieldValue.equals("DAY")) {
if (v1 instanceof ValueTimestampTimeZone) { result = DateTimeUtils.truncateToDay(v1, fieldDateValue);
// Create a new ValueTimestampTimeZone by only setting the
// date. The time in nanoseconds since midnight will be set
// to 0.
ValueTimestampTimeZone v = (ValueTimestampTimeZone) v1;
result = ValueTimestampTimeZone.fromDateValueAndNanos(v.getDateValue(), 0,
v.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(fieldDateValue, 0);
}
} else { } else {
// Return an exception for the other possible value (not yet supported).
throw DbException.getUnsupportedException(v0.getString()); throw DbException.getUnsupportedException(v0.getString());
} }
break; break;
......
...@@ -1470,5 +1470,35 @@ public class DateTimeUtils { ...@@ -1470,5 +1470,35 @@ public class DateTimeUtils {
} }
return nanosOfDay - mod; return nanosOfDay - mod;
} }
/**
* Truncate the given date to 'day'
*
* @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) {
Value result = null;
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);
}
return result;
}
} }
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论