]> source.dussan.org Git - jackcess.git/commitdiff
test TimeSerial; implement DateSerial
authorJames Ahlborn <jtahlborn@yahoo.com>
Thu, 26 Jul 2018 20:22:13 +0000 (20:22 +0000)
committerJames Ahlborn <jtahlborn@yahoo.com>
Thu, 26 Jul 2018 20:22:13 +0000 (20:22 +0000)
git-svn-id: https://svn.code.sf.net/p/jackcess/code/jackcess/trunk@1187 f203690c-595d-4dc9-a70b-905162fa7fd2

src/main/java/com/healthmarketscience/jackcess/impl/expr/DefaultDateFunctions.java
src/test/java/com/healthmarketscience/jackcess/impl/expr/DefaultFunctionsTest.java

index 7bfb256e7f98386bcae84d0c57d71018126938fa..ac5313c0c6703e645223cfc41cb28a6dc9987248 100644 (file)
@@ -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);
index 8248c080d2da6f1d1d192f0280a79476c06ddd25..ca1a67c8e9a57043c7d0db2328f7ef51cba93aeb 100644 (file)
@@ -237,6 +237,15 @@ public class DefaultFunctionsTest extends TestCase
 
     assertEquals("3:57:34 AM", eval("=CStr(TimeSerial(3,57,34))"));
     assertEquals("3:57:34 PM", eval("=CStr(TimeSerial(15,57,34))"));
+    assertEquals("5:45:00 AM", eval("=CStr(TimeSerial(6,-15,0))"));
+    assertEquals("12:00:00 AM", eval("=CStr(TimeSerial(0,0,0))"));
+    assertEquals("2:00:00 PM", eval("=CStr(TimeSerial(-10,0,0))"));
+    assertEquals("6:00:00 AM", eval("=CStr(TimeSerial(30,0,0))"));
+
+    assertEquals("2/12/1969", eval("=CStr(DateSerial(69,2,12))"));
+    assertEquals("2/12/2010", eval("=CStr(DateSerial(10,2,12))"));
+    assertEquals("7/12/2013", eval("=CStr(DateSerial(2014,-5,12))"));
+    assertEquals("8/7/2013", eval("=CStr(DateSerial(2014,-5,38))"));
   }
 
   public void testFinancialFuncs() throws Exception