Browse Source

initial work for DateAdd function

git-svn-id: https://svn.code.sf.net/p/jackcess/code/jackcess/trunk@1212 f203690c-595d-4dc9-a70b-905162fa7fd2
tags/jackcess-2.2.1
James Ahlborn 5 years ago
parent
commit
8d5f4dc169

+ 43
- 0
src/main/java/com/healthmarketscience/jackcess/impl/expr/DefaultDateFunctions.java View File

@@ -157,6 +157,49 @@ public class DefaultDateFunctions
}
});

public static final Function DATEADD = registerFunc(new Func3("DateAdd") {
@Override
protected Value eval3(EvalContext ctx,
Value param1, Value param2, Value param3) {
if(param3.isNull()) {
return ValueSupport.NULL_VAL;
}

String intv = param1.getAsString(ctx).trim();
int val = param2.getAsLongInt(ctx);

int result = -1;
Calendar cal = nonNullToCalendar(ctx, param3);

// FIXME
if(intv.equalsIgnoreCase(INTV_YEAR)) {
cal.add(Calendar.YEAR, val);
} else if(intv.equalsIgnoreCase(INTV_QUARTER)) {
cal.add(Calendar.MONTH, val * 3);
} else if(intv.equalsIgnoreCase(INTV_MONTH)) {
cal.add(Calendar.MONTH, val);
} else if(intv.equalsIgnoreCase(INTV_DAY_OF_YEAR)) {
cal.add(Calendar.DAY_OF_YEAR, val);
} else if(intv.equalsIgnoreCase(INTV_DAY)) {
cal.add(Calendar.DAY_OF_YEAR, val);
} else if(intv.equalsIgnoreCase(INTV_WEEKDAY)) {
cal.add(Calendar.DAY_OF_WEEK, val);
} else if(intv.equalsIgnoreCase(INTV_WEEK)) {
cal.add(Calendar.WEEK_OF_YEAR, val);
} else if(intv.equalsIgnoreCase(INTV_HOUR)) {
cal.add(Calendar.HOUR, val);
} else if(intv.equalsIgnoreCase(INTV_MINUTE)) {
cal.add(Calendar.MINUTE, val);
} else if(intv.equalsIgnoreCase(INTV_SECOND)) {
cal.add(Calendar.SECOND, val);
} else {
throw new EvalException("Invalid interval " + intv);
}

return ValueSupport.toValue(cal);
}
});

public static final Function NOW = registerFunc(new Func0("Now") {
@Override
protected Value eval0(EvalContext ctx) {

+ 3
- 0
src/main/java/com/healthmarketscience/jackcess/impl/expr/ExpressionTokenizer.java View File

@@ -54,6 +54,9 @@ class ExpressionTokenizer
private static final char EQUALS_CHAR = '=';

// access times are based on this date (not the UTC base)
static final int BASE_DATE_YEAR = 1899;
static final int BASE_DATE_MONTH = 12;
static final int BASE_DATE_DAY = 30;
private static final String BASE_DATE_PREFIX = "1899/12/30 ";
private static final String BASE_DATE_FMT_PREFIX = "yyyy/M/d ";


+ 19
- 1
src/main/java/com/healthmarketscience/jackcess/impl/expr/ValueSupport.java View File

@@ -18,10 +18,11 @@ package com.healthmarketscience.jackcess.impl.expr;

import java.math.BigDecimal;
import java.text.DateFormat;
import java.util.Calendar;
import java.util.Date;

import com.healthmarketscience.jackcess.expr.LocaleContext;
import com.healthmarketscience.jackcess.expr.EvalException;
import com.healthmarketscience.jackcess.expr.LocaleContext;
import com.healthmarketscience.jackcess.expr.Value;
import com.healthmarketscience.jackcess.impl.ColumnImpl;

@@ -91,6 +92,23 @@ public class ValueSupport
ColumnImpl.fromDateDouble(dd, ctx.getCalendar())));
}

public static Value toValue(Calendar cal) {
boolean hasTime = ((cal.get(Calendar.HOUR) != 0) ||
(cal.get(Calendar.MINUTE) != 0) ||
(cal.get(Calendar.SECOND) == 0));

boolean hasDate =
((cal.get(Calendar.YEAR) != ExpressionTokenizer.BASE_DATE_YEAR) ||
((cal.get(Calendar.MONTH) + 1) != ExpressionTokenizer.BASE_DATE_MONTH) ||
(cal.get(Calendar.DAY_OF_MONTH) == ExpressionTokenizer.BASE_DATE_DAY));

Value.Type type = (hasDate ?
(hasTime ? Value.Type.DATE_TIME : Value.Type.DATE) :
Value.Type.TIME);

return new DateTimeValue(type, cal.getTime());
}

public static Value toValue(Value.Type type, Date d) {
return new DateTimeValue(type, d);
}

Loading…
Cancel
Save