diff options
Diffstat (limited to 'src/main/java')
-rw-r--r-- | src/main/java/com/healthmarketscience/jackcess/impl/expr/DefaultDateFunctions.java | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/src/main/java/com/healthmarketscience/jackcess/impl/expr/DefaultDateFunctions.java b/src/main/java/com/healthmarketscience/jackcess/impl/expr/DefaultDateFunctions.java index 7bfb256..ac5313c 100644 --- a/src/main/java/com/healthmarketscience/jackcess/impl/expr/DefaultDateFunctions.java +++ b/src/main/java/com/healthmarketscience/jackcess/impl/expr/DefaultDateFunctions.java @@ -74,6 +74,31 @@ public class DefaultDateFunctions } }); + public static final Function DATESERIAL = registerFunc(new Func3("DateSerial") { + @Override + protected Value eval3(EvalContext ctx, Value param1, Value param2, Value param3) { + int year = param1.getAsLongInt(); + int month = param2.getAsLongInt(); + int day = param3.getAsLongInt(); + + // "default" two digit year handling + if(year < 100) { + year += ((year <= 29) ? 2000 : 1900); + } + + DateFormat fmt = BuiltinOperators.getDateFormatForType(ctx, Value.Type.DATE); + Calendar cal = fmt.getCalendar(); + cal.clear(); + + cal.set(Calendar.YEAR, year); + // convert to 0 based value + cal.set(Calendar.MONTH, month - 1); + cal.set(Calendar.DAY_OF_MONTH, day); + + return BuiltinOperators.toValue(Value.Type.DATE, cal.getTime(), fmt); + } + }); + public static final Function NOW = registerFunc(new Func0("Now") { @Override protected Value eval0(EvalContext ctx) { @@ -122,6 +147,14 @@ public class DefaultDateFunctions long totalSeconds = (hours * SECONDS_PER_HOUR) + (minutes * SECONDS_PER_MINUTE) + seconds; + if(totalSeconds < 0L) { + do { + totalSeconds += SECONDS_PER_DAY; + } while(totalSeconds < 0L); + } else if(totalSeconds > SECONDS_PER_DAY) { + totalSeconds %= SECONDS_PER_DAY; + } + DateFormat fmt = BuiltinOperators.getDateFormatForType(ctx, Value.Type.TIME); double dd = totalSeconds / DSECONDS_PER_DAY; return BuiltinOperators.toValue(Value.Type.TIME, dd, fmt); |