bug fixing and more test cases for date type.

git-svn-id: https://asterixdb.googlecode.com/svn/branches/asterix_stabilization_temp_missing_tests@1286 eaa15691-b419-025a-1212-ee371bd00084
diff --git a/asterix-app/data/temporal/temporalData.json b/asterix-app/data/temporal/temporalData.json
index 520fd4b..27a812e 100644
--- a/asterix-app/data/temporal/temporalData.json
+++ b/asterix-app/data/temporal/temporalData.json
@@ -1,3 +1,3 @@
-{"id": "001", "dateField": date("-2012-12-12"), "dateFieldPlus": date("0990-01-01"), "timeField": time("23:49:12.39Z"), "timeFieldPlus": time("03:23:12.2"), "datetimeField": datetime("2012-12-12T00:00:00.001"), "datetimeFieldPlus": datetime("-00130810T221015398"), "durationField": duration("P20Y19DT3H74M23.34S"), "durationFieldPlus": duration("-P2MT4M300.68S"), "intervalField": dtinterval("2012-12-12T00:00:00.001,20130810T221015398") }
+{"id": "001", "dateField": date("-2012-12-12"), "dateFieldPlus": date("0990-01-01"), "timeField": time("23:49:12.39Z"), "timeFieldPlus": time("03:23:12.2"), "datetimeField": datetime("2012-12-12T00:00:00.001"), "datetimeFieldPlus": datetime("-00130810T221015398"), "durationField": duration("P20Y19DT3H74M23.34S"), "durationFieldPlus": duration("-P2MT4M300.68S"), "intervalField": interval-datetime("2012-12-12T00:00:00.001,20130810T221015398") }
 {"id": "002", "datetimeField": datetime("19201220T232918478") }
-{"id": "003", "intervalPlus": tinterval("19:23:32.328Z,23:20:20") }
\ No newline at end of file
+{"id": "003", "intervalPlus": interval-time("19:23:32.328Z,23:20:20") }
\ No newline at end of file
diff --git a/asterix-app/src/test/resources/runtimets/queries/constructor/date_01.aql b/asterix-app/src/test/resources/runtimets/queries/constructor/date_01.aql
index 9bbfb9d..821854c 100644
--- a/asterix-app/src/test/resources/runtimets/queries/constructor/date_01.aql
+++ b/asterix-app/src/test/resources/runtimets/queries/constructor/date_01.aql
@@ -12,6 +12,8 @@
 let $c6 := date("-2043-11-19")
 let $c7 := date("-19280329")
 let $c8 := date("19280329")
+let $c9 := date("19000228")
+let $c10 := date("20000229")
 
-return {"date1": $c1, "date2": $c2, "date3": $c3, "date4": $c4, "date5": $c5, "date6": $c6, "date7": $c7, "date8": $c8}
+return {"date1": $c1, "date2": $c2, "date3": $c3, "date4": $c4, "date5": $c5, "date6": $c6, "date7": $c7, "date8": $c8, "date9": $c9, "date10": $c10}
 
diff --git a/asterix-app/src/test/resources/runtimets/results/constructor/date_01.adm b/asterix-app/src/test/resources/runtimets/results/constructor/date_01.adm
index 2a90c4d..8a08a03 100644
--- a/asterix-app/src/test/resources/runtimets/results/constructor/date_01.adm
+++ b/asterix-app/src/test/resources/runtimets/results/constructor/date_01.adm
@@ -1 +1 @@
-{ "date1": date("2010-10-30"), "date2": date("1987-11-19"), "date3": date("-1987-11-19"), "date4": date("0001-12-27"), "date5": date("-1951-12-27"), "date6": date("-2043-11-19"), "date7": date("-1928-03-29"), "date8": date("1928-03-29") }
\ No newline at end of file
+{ "date1": date("2010-10-30"), "date2": date("1987-11-19"), "date3": date("-1987-11-19"), "date4": date("0001-12-27"), "date5": date("-1951-12-27"), "date6": date("-2043-11-19"), "date7": date("-1928-03-29"), "date8": date("1928-03-29"), "date9": date("1900-02-28"), "date10": date("2000-02-29") }
\ No newline at end of file
diff --git a/asterix-app/src/test/resources/runtimets/results/temp/insert_from_ext_ds.adm b/asterix-app/src/test/resources/runtimets/results/temp/insert_from_ext_ds.adm
index afe2ccc..842d00c 100644
--- a/asterix-app/src/test/resources/runtimets/results/temp/insert_from_ext_ds.adm
+++ b/asterix-app/src/test/resources/runtimets/results/temp/insert_from_ext_ds.adm
@@ -1,3 +1,3 @@
-{ "date": date("-2012-12-12"), "time": time("23:49:12.390Z"), "datetime": datetime("2012-12-12T00:00:00.001Z"), "duration": duration("P20Y19DT4H14M23.34S"), "interval": interval("datetime("2012-12-12T00:00:00.001Z"), datetime("2013-08-10T22:10:15.398Z")") }
+{ "date": date("-2012-12-12"), "time": time("23:49:12.390Z"), "datetime": datetime("2012-12-12T00:00:00.001Z"), "duration": duration("P20Y19DT4H14M23.34S"), "interval": interval-datetime("2012-12-12T00:00:00.001Z, 2013-08-10T22:10:15.398Z") }
 { "date": null, "time": null, "datetime": datetime("1920-12-20T23:29:18.478Z"), "duration": null, "interval": null }
 { "date": null, "time": null, "datetime": null, "duration": null, "interval": null }
\ No newline at end of file
diff --git a/asterix-app/src/test/resources/runtimets/testsuite.xml b/asterix-app/src/test/resources/runtimets/testsuite.xml
index de694cd..480438d 100644
--- a/asterix-app/src/test/resources/runtimets/testsuite.xml
+++ b/asterix-app/src/test/resources/runtimets/testsuite.xml
@@ -3934,4 +3934,51 @@
       </compilation-unit>
     </test-case>
   </test-group>
+  <test-group name="temp">
+  	<test-case FilePath="temp">
+  		<compilation-unit name="accessors">
+        <output-file compare="Text">accessors.adm</output-file>
+      </compilation-unit>
+  	</test-case>
+  	<test-case FilePath="temp">
+  		<compilation-unit name="adjust_timezone">
+        <output-file compare="Text">adjust_timezone.adm</output-file>
+      </compilation-unit>
+  	</test-case>
+  	<test-case FilePath="temp">
+  		<compilation-unit name="calendar_duration">
+        <output-file compare="Text">calendar_duration.adm</output-file>
+      </compilation-unit>
+  	</test-case>
+  	<test-case FilePath="temp">
+  		<compilation-unit name="date_functions">
+        <output-file compare="Text">date_functions.adm</output-file>
+      </compilation-unit>
+  	</test-case>
+  	<test-case FilePath="temp">
+  		<compilation-unit name="datetime_functions">
+        <output-file compare="Text">datetime_functions.adm</output-file>
+      </compilation-unit>
+  	</test-case>
+<!--   	<test-case FilePath="temp">
+  		<compilation-unit name="insert_from_delimited_ds">
+        <output-file compare="Text">insert_from_delimited_ds.adm</output-file>
+      </compilation-unit>
+  	</test-case> -->
+  	<test-case FilePath="temp">
+  		<compilation-unit name="insert_from_ext_ds">
+        <output-file compare="Text">insert_from_ext_ds.adm</output-file>
+      </compilation-unit>
+  	</test-case>
+  	<test-case FilePath="temp">
+  		<compilation-unit name="interval_functions">
+        <output-file compare="Text">interval_functions.adm</output-file>
+      </compilation-unit>
+  	</test-case>
+  	<test-case FilePath="temp">
+  		<compilation-unit name="time_functions">
+        <output-file compare="Text">time_functions.adm</output-file>
+      </compilation-unit>
+  	</test-case>
+  </test-group>
 </test-suite>
diff --git a/asterix-om/src/main/java/edu/uci/ics/asterix/dataflow/data/nontagged/printers/ADatePrinter.java b/asterix-om/src/main/java/edu/uci/ics/asterix/dataflow/data/nontagged/printers/ADatePrinter.java
index 918e286..327faf1 100644
--- a/asterix-om/src/main/java/edu/uci/ics/asterix/dataflow/data/nontagged/printers/ADatePrinter.java
+++ b/asterix-om/src/main/java/edu/uci/ics/asterix/dataflow/data/nontagged/printers/ADatePrinter.java
@@ -30,4 +30,14 @@
                 .append("-").append(String.format("%02d", gCalInstance.getDayOfMonthYear(chrononTime, year, month)));
         ps.print("\")");
     }
+
+    public void printString(byte[] b, int s, int l, PrintStream ps) throws AlgebricksException {
+        long chrononTime = AInt32SerializerDeserializer.getInt(b, s + 1) * CHRONON_OF_DAY;
+
+        int year = gCalInstance.getYear(chrononTime);
+        int month = gCalInstance.getMonthOfYear(chrononTime, year);
+
+        ps.append(String.format(year < 0 ? "%05d" : "%04d", year)).append("-").append(String.format("%02d", month))
+                .append("-").append(String.format("%02d", gCalInstance.getDayOfMonthYear(chrononTime, year, month)));
+    }
 }
\ No newline at end of file
diff --git a/asterix-om/src/main/java/edu/uci/ics/asterix/dataflow/data/nontagged/printers/ADateTimePrinter.java b/asterix-om/src/main/java/edu/uci/ics/asterix/dataflow/data/nontagged/printers/ADateTimePrinter.java
index 96df767..7cf1478 100644
--- a/asterix-om/src/main/java/edu/uci/ics/asterix/dataflow/data/nontagged/printers/ADateTimePrinter.java
+++ b/asterix-om/src/main/java/edu/uci/ics/asterix/dataflow/data/nontagged/printers/ADateTimePrinter.java
@@ -33,4 +33,18 @@
                 .append(String.format("%03d", gCalInstance.getMillisOfSec(chrononTime))).append("Z");
         ps.print("\")");
     }
+
+    public void printString(byte[] b, int s, int l, PrintStream ps) throws AlgebricksException {
+        long chrononTime = AInt64SerializerDeserializer.getLong(b, s + 1);
+
+        int year = gCalInstance.getYear(chrononTime);
+        int month = gCalInstance.getMonthOfYear(chrononTime, year);
+
+        ps.append(String.format(year < 0 ? "%05d" : "%04d", year)).append("-").append(String.format("%02d", month))
+                .append("-").append(String.format("%02d", gCalInstance.getDayOfMonthYear(chrononTime, year, month)))
+                .append("T").append(String.format("%02d", gCalInstance.getHourOfDay(chrononTime))).append(":")
+                .append(String.format("%02d", gCalInstance.getMinOfHour(chrononTime))).append(":")
+                .append(String.format("%02d", gCalInstance.getSecOfMin(chrononTime))).append(".")
+                .append(String.format("%03d", gCalInstance.getMillisOfSec(chrononTime))).append("Z");
+    }
 }
\ No newline at end of file
diff --git a/asterix-om/src/main/java/edu/uci/ics/asterix/dataflow/data/nontagged/printers/AIntervalPrinter.java b/asterix-om/src/main/java/edu/uci/ics/asterix/dataflow/data/nontagged/printers/AIntervalPrinter.java
index 99c40b2..b96feff 100644
--- a/asterix-om/src/main/java/edu/uci/ics/asterix/dataflow/data/nontagged/printers/AIntervalPrinter.java
+++ b/asterix-om/src/main/java/edu/uci/ics/asterix/dataflow/data/nontagged/printers/AIntervalPrinter.java
@@ -23,8 +23,6 @@
 
 public class AIntervalPrinter implements IPrinter {
 
-    private static final long serialVersionUID = 1L;
-
     public static final AIntervalPrinter INSTANCE = new AIntervalPrinter();
 
     /* (non-Javadoc)
@@ -39,32 +37,34 @@
      */
     @Override
     public void print(byte[] b, int s, int l, PrintStream ps) throws AlgebricksException {
-        ps.print("interval(\"");
+        ps.print("interval");
 
         short typetag = AInt8SerializerDeserializer.getByte(b, s + 1 + 8 * 2);
 
         IPrinter timeInstancePrinter;
 
         if (typetag == ATypeTag.DATE.serialize()) {
+            ps.print("-date(\"");
             timeInstancePrinter = ADatePrinter.INSTANCE;
+            ((ADatePrinter)timeInstancePrinter).printString(b, s + 4, 4, ps);
+            ps.print(", ");
+            ((ADatePrinter)timeInstancePrinter).printString(b, s + 12, 4, ps);
         } else if (typetag == ATypeTag.TIME.serialize()) {
+            ps.print("-time(\"");
             timeInstancePrinter = ATimePrinter.INSTANCE;
+            ((ATimePrinter)timeInstancePrinter).printString(b, s + 4, 4, ps);
+            ps.print(", ");
+            ((ATimePrinter)timeInstancePrinter).printString(b, s + 12, 4, ps);
         } else if (typetag == ATypeTag.DATETIME.serialize()) {
+            ps.print("-datetime(\"");
             timeInstancePrinter = ADateTimePrinter.INSTANCE;
+            ((ADateTimePrinter)timeInstancePrinter).printString(b, s, 8, ps);
+            ps.print(", ");
+            ((ADateTimePrinter)timeInstancePrinter).printString(b, s + 8, 8, ps);
         } else {
             throw new AlgebricksException("Unsupport internal time types in interval: " + typetag);
         }
 
-        if (typetag == ATypeTag.TIME.serialize() || typetag == ATypeTag.DATE.serialize()) {
-            timeInstancePrinter.print(b, s + 1 + 4 - 1, 8, ps);
-            ps.print(", ");
-            timeInstancePrinter.print(b, s + 1 + 8 + 4 - 1, 8, ps);
-        } else {
-            timeInstancePrinter.print(b, s, 8, ps);
-            ps.print(", ");
-            timeInstancePrinter.print(b, s + 1 + 8 - 1, 8, ps);
-        }
-
         ps.print("\")");
     }
 }
diff --git a/asterix-om/src/main/java/edu/uci/ics/asterix/dataflow/data/nontagged/printers/ATimePrinter.java b/asterix-om/src/main/java/edu/uci/ics/asterix/dataflow/data/nontagged/printers/ATimePrinter.java
index b77ee64..aba6a4b 100644
--- a/asterix-om/src/main/java/edu/uci/ics/asterix/dataflow/data/nontagged/printers/ATimePrinter.java
+++ b/asterix-om/src/main/java/edu/uci/ics/asterix/dataflow/data/nontagged/printers/ATimePrinter.java
@@ -29,5 +29,14 @@
 
         ps.print("\")");
     }
+    
+    public void printString(byte[] b, int s, int l, PrintStream ps) throws AlgebricksException {
+        int time = AInt32SerializerDeserializer.getInt(b, s + 1);
+
+        ps.append(String.format("%02d", gCalInstance.getHourOfDay(time))).append(":")
+                .append(String.format("%02d", gCalInstance.getMinOfHour(time))).append(":")
+                .append(String.format("%02d", gCalInstance.getSecOfMin(time))).append(".")
+                .append(String.format("%03d", gCalInstance.getMillisOfSec(time))).append("Z");
+    }
 
 }
\ No newline at end of file
diff --git a/asterix-om/src/main/java/edu/uci/ics/asterix/dataflow/data/nontagged/serde/ADateSerializerDeserializer.java b/asterix-om/src/main/java/edu/uci/ics/asterix/dataflow/data/nontagged/serde/ADateSerializerDeserializer.java
index 86a9a8d..d4ce0e5 100644
--- a/asterix-om/src/main/java/edu/uci/ics/asterix/dataflow/data/nontagged/serde/ADateSerializerDeserializer.java
+++ b/asterix-om/src/main/java/edu/uci/ics/asterix/dataflow/data/nontagged/serde/ADateSerializerDeserializer.java
@@ -65,7 +65,7 @@
         try {
             StringCharSequenceAccessor charAccessor = new StringCharSequenceAccessor();
             charAccessor.reset(date, 0, date.length());
-            chrononTimeInMs = ADateParserFactory.parseDatePart(charAccessor, true);
+            chrononTimeInMs = ADateParserFactory.parseDatePart(charAccessor);
         } catch (Exception e) {
             throw new HyracksDataException(e);
         }
diff --git a/asterix-om/src/main/java/edu/uci/ics/asterix/dataflow/data/nontagged/serde/ADateTimeSerializerDeserializer.java b/asterix-om/src/main/java/edu/uci/ics/asterix/dataflow/data/nontagged/serde/ADateTimeSerializerDeserializer.java
index cedfc8d..93825b9 100644
--- a/asterix-om/src/main/java/edu/uci/ics/asterix/dataflow/data/nontagged/serde/ADateTimeSerializerDeserializer.java
+++ b/asterix-om/src/main/java/edu/uci/ics/asterix/dataflow/data/nontagged/serde/ADateTimeSerializerDeserializer.java
@@ -67,22 +67,25 @@
         long chrononTimeInMs = 0;
         try {
             StringCharSequenceAccessor charAccessor = new StringCharSequenceAccessor();
+            
             charAccessor.reset(datetime, 0, datetime.length());
 
             // +1 if it is negative (-)
             short timeOffset = (short) ((charAccessor.getCharAt(0) == '-') ? 1 : 0);
 
-            if (charAccessor.getCharAt(timeOffset + 10) != 'T' && charAccessor.getCharAt(timeOffset + 8) != 'T') {
-                throw new AlgebricksException(errorMessage + ": missing T");
+            timeOffset += 8;
+            
+            if(charAccessor.getCharAt(timeOffset) != 'T'){
+                timeOffset += 2;
+                if(charAccessor.getCharAt(timeOffset) != 'T'){
+                    throw new AlgebricksException(errorMessage + ": missing T");
+                }
             }
 
-            // if extended form 11, else 9
-            timeOffset += (charAccessor.getCharAt(timeOffset + 13) == ':') ? (short) (11) : (short) (9);
+            charAccessor.reset(datetime, 0, timeOffset);
+            chrononTimeInMs = ADateParserFactory.parseDatePart(charAccessor);
 
-            chrononTimeInMs = ADateParserFactory.parseDatePart(charAccessor, false);
-
-            charAccessor.reset(datetime, timeOffset, datetime.length() - timeOffset);
-
+            charAccessor.reset(datetime, timeOffset + 1, datetime.length() - timeOffset - 1);
             chrononTimeInMs += ATimeParserFactory.parseTimePart(charAccessor);
         } catch (Exception e) {
             throw new HyracksDataException(e);
diff --git a/asterix-om/src/main/java/edu/uci/ics/asterix/dataflow/data/nontagged/serde/AIntervalSerializerDeserializer.java b/asterix-om/src/main/java/edu/uci/ics/asterix/dataflow/data/nontagged/serde/AIntervalSerializerDeserializer.java
index 7c87dfa..f1dc57a 100644
--- a/asterix-om/src/main/java/edu/uci/ics/asterix/dataflow/data/nontagged/serde/AIntervalSerializerDeserializer.java
+++ b/asterix-om/src/main/java/edu/uci/ics/asterix/dataflow/data/nontagged/serde/AIntervalSerializerDeserializer.java
@@ -95,60 +95,74 @@
 
             StringCharSequenceAccessor charAccessor = new StringCharSequenceAccessor();
 
+            // the starting point for parsing (so for the accessor)
+            int startOffset = 0;
+            int endOffset, timeSeperatorOffsetInDatetimeString;
+
             // Get the index for the comma
             int commaIndex = interval.indexOf(',');
-            if (commaIndex < 0) {
+            if (commaIndex < 1) {
                 throw new AlgebricksException("comma is missing for a string of interval");
             }
 
-            int nonSpaceIndex = commaIndex - 1;
-            while (interval.charAt(nonSpaceIndex) == ' ') {
-                nonSpaceIndex--;
+            endOffset = commaIndex - 1;
+
+            while (interval.charAt(endOffset) == ' ') {
+                endOffset--;
             }
 
-            // Interval Start
-            charAccessor.reset(interval, 0, nonSpaceIndex + 1);
+            while (interval.charAt(startOffset) == '"' || interval.charAt(startOffset) == ' ') {
+                startOffset++;
+            }
+
+            charAccessor.reset(interval, startOffset, endOffset - startOffset + 1);
 
             // +1 if it is negative (-)
-            short timeOffset = (short) ((charAccessor.getCharAt(0) == '-') ? 1 : 0);
+            timeSeperatorOffsetInDatetimeString = ((charAccessor.getCharAt(0) == '-') ? 1 : 0);
 
-            if (charAccessor.getCharAt(timeOffset + 10) != 'T' && charAccessor.getCharAt(timeOffset + 8) != 'T') {
-                throw new AlgebricksException(errorMessage + ": missing T");
+            timeSeperatorOffsetInDatetimeString += 8;
+
+            if (charAccessor.getCharAt(timeSeperatorOffsetInDatetimeString) != 'T') {
+                timeSeperatorOffsetInDatetimeString += 2;
+                if (charAccessor.getCharAt(timeSeperatorOffsetInDatetimeString) != 'T') {
+                    throw new AlgebricksException(errorMessage + ": missing T for a datetime value.");
+                }
             }
-
-            // if extended form 11, else 9
-            timeOffset += (charAccessor.getCharAt(timeOffset + 13) == ':') ? (short) (11) : (short) (9);
-
-            chrononTimeInMsStart = ADateParserFactory.parseDatePart(charAccessor, false);
-
-            charAccessor.reset(interval, timeOffset, nonSpaceIndex - timeOffset + 1);
-
+            charAccessor.reset(interval, startOffset, timeSeperatorOffsetInDatetimeString);
+            chrononTimeInMsStart = ADateParserFactory.parseDatePart(charAccessor);
+            charAccessor.reset(interval, startOffset + timeSeperatorOffsetInDatetimeString + 1, endOffset
+                    - (startOffset + timeSeperatorOffsetInDatetimeString + 1) + 1);
             chrononTimeInMsStart += ATimeParserFactory.parseTimePart(charAccessor);
 
             // Interval End
-            nonSpaceIndex = commaIndex + 1;
-            while (interval.charAt(nonSpaceIndex) == ' ') {
-                nonSpaceIndex++;
+            startOffset = commaIndex + 1;
+            endOffset = interval.length() - 1;
+            while (interval.charAt(endOffset) == '"' || interval.charAt(endOffset) == ' ') {
+                endOffset--;
             }
 
-            charAccessor.reset(interval, nonSpaceIndex, interval.length() - nonSpaceIndex);
+            while (interval.charAt(startOffset) == ' ') {
+                startOffset++;
+            }
+
+            charAccessor.reset(interval, startOffset, endOffset - startOffset + 1);
 
             // +1 if it is negative (-)
-            timeOffset = (short) ((charAccessor.getCharAt(0) == '-') ? 1 : 0);
+            timeSeperatorOffsetInDatetimeString = ((charAccessor.getCharAt(0) == '-') ? 1 : 0);
 
-            if (charAccessor.getCharAt(timeOffset + 10) != 'T' && charAccessor.getCharAt(timeOffset + 8) != 'T') {
-                throw new AlgebricksException(errorMessage + ": missing T");
+            timeSeperatorOffsetInDatetimeString += 8;
+
+            if (charAccessor.getCharAt(timeSeperatorOffsetInDatetimeString) != 'T') {
+                timeSeperatorOffsetInDatetimeString += 2;
+                if (charAccessor.getCharAt(timeSeperatorOffsetInDatetimeString) != 'T') {
+                    throw new AlgebricksException(errorMessage + ": missing T for a datetime value.");
+                }
             }
-
-            // if extended form 11, else 9
-            timeOffset += (charAccessor.getCharAt(timeOffset + 13) == ':') ? (short) (11) : (short) (9);
-
-            chrononTimeInMsEnd = ADateParserFactory.parseDatePart(charAccessor, false);
-
-            charAccessor.reset(interval, nonSpaceIndex + timeOffset, interval.length() - nonSpaceIndex - timeOffset);
-
+            charAccessor.reset(interval, startOffset, timeSeperatorOffsetInDatetimeString);
+            chrononTimeInMsEnd = ADateParserFactory.parseDatePart(charAccessor);
+            charAccessor.reset(interval, startOffset + timeSeperatorOffsetInDatetimeString + 1, endOffset
+                    - (startOffset + timeSeperatorOffsetInDatetimeString + 1) + 1);
             chrononTimeInMsEnd += ATimeParserFactory.parseTimePart(charAccessor);
-
         } catch (Exception e) {
             throw new HyracksDataException(e);
         }
@@ -167,19 +181,27 @@
 
             StringCharSequenceAccessor charAccessor = new StringCharSequenceAccessor();
 
+            int startOffset = 0;
+            int endOffset;
+
             // Get the index for the comma
             int commaIndex = interval.indexOf(',');
             if (commaIndex < 0) {
                 throw new AlgebricksException("comma is missing for a string of interval");
             }
 
-            int nonSpaceIndex = commaIndex - 1;
-            while (interval.charAt(nonSpaceIndex) == ' ') {
-                nonSpaceIndex--;
+            endOffset = commaIndex - 1;
+
+            while (interval.charAt(endOffset) == ' ') {
+                endOffset--;
+            }
+
+            while (interval.charAt(startOffset) == '"' || interval.charAt(startOffset) == ' ') {
+                startOffset++;
             }
 
             // Interval Start
-            charAccessor.reset(interval, 0, nonSpaceIndex + 1);
+            charAccessor.reset(interval, startOffset, endOffset - startOffset + 1);
             chrononTimeInMsStart = ATimeParserFactory.parseTimePart(charAccessor);
 
             if (chrononTimeInMsStart < 0) {
@@ -187,12 +209,18 @@
             }
 
             // Interval End
-            nonSpaceIndex = commaIndex + 1;
-            while (interval.charAt(nonSpaceIndex) == ' ') {
-                nonSpaceIndex++;
+            startOffset = commaIndex + 1;
+            while (interval.charAt(startOffset) == ' ') {
+                startOffset++;
             }
 
-            charAccessor.reset(interval, nonSpaceIndex, interval.length() - nonSpaceIndex);
+            endOffset = interval.length() - 1;
+
+            while (interval.charAt(endOffset) == '"' || interval.charAt(endOffset) == ' ') {
+                endOffset--;
+            }
+
+            charAccessor.reset(interval, startOffset, endOffset - startOffset + 1);
             chrononTimeInMsEnd = ATimeParserFactory.parseTimePart(charAccessor);
 
             if (chrononTimeInMsEnd < 0) {
@@ -217,40 +245,43 @@
         try {
             StringCharSequenceAccessor charAccessor = new StringCharSequenceAccessor();
 
+            // the starting point for parsing (so for the accessor)
+            int startOffset = 0;
+            int endOffset;
+
             // Get the index for the comma
             int commaIndex = interval.indexOf(',');
-            if (commaIndex < 0) {
+            if (commaIndex < 1) {
                 throw new AlgebricksException("comma is missing for a string of interval");
             }
 
-            int nonSpaceIndex = commaIndex - 1;
-            while (interval.charAt(nonSpaceIndex) == ' ') {
-                nonSpaceIndex--;
+            endOffset = commaIndex - 1;
+
+            while (interval.charAt(endOffset) == ' ') {
+                endOffset--;
             }
 
-            // Interval Start
-            charAccessor.reset(interval, 0, nonSpaceIndex + 1);
-
-            chrononTimeInMsStart = ADateParserFactory.parseDatePart(charAccessor, true);
-
-            if (chrononTimeInMsStart < 0 && chrononTimeInMsStart % GregorianCalendarSystem.CHRONON_OF_DAY != 0) {
-                tempStart = 1;
+            while (interval.charAt(startOffset) == '"' || interval.charAt(startOffset) == ' ') {
+                startOffset++;
             }
 
+            charAccessor.reset(interval, startOffset, endOffset - startOffset + 1);
+            chrononTimeInMsStart = ADateParserFactory.parseDatePart(charAccessor);
+
             // Interval End
-            nonSpaceIndex = commaIndex + 1;
-            while (interval.charAt(nonSpaceIndex) == ' ') {
-                nonSpaceIndex++;
+            startOffset = commaIndex + 1;
+            endOffset = interval.length() - 1;
+            while (interval.charAt(startOffset) == '"' || interval.charAt(endOffset) == ' ') {
+                endOffset--;
             }
 
-            charAccessor.reset(interval, nonSpaceIndex, interval.length() - nonSpaceIndex);
-
-            chrononTimeInMsEnd = ADateParserFactory.parseDatePart(charAccessor, true);
-
-            if (chrononTimeInMsEnd < 0 && chrononTimeInMsEnd % GregorianCalendarSystem.CHRONON_OF_DAY != 0) {
-                tempEnd = 1;
+            while (interval.charAt(startOffset) == ' ') {
+                startOffset++;
             }
 
+            charAccessor.reset(interval, startOffset, endOffset - startOffset + 1);
+            chrononTimeInMsEnd += ATimeParserFactory.parseTimePart(charAccessor);
+
         } catch (Exception e) {
             throw new HyracksDataException(e);
         }
diff --git a/asterix-om/src/main/java/edu/uci/ics/asterix/om/base/temporal/ADateParserFactory.java b/asterix-om/src/main/java/edu/uci/ics/asterix/om/base/temporal/ADateParserFactory.java
index 8192919..7a335a7 100644
--- a/asterix-om/src/main/java/edu/uci/ics/asterix/om/base/temporal/ADateParserFactory.java
+++ b/asterix-om/src/main/java/edu/uci/ics/asterix/om/base/temporal/ADateParserFactory.java
@@ -44,7 +44,7 @@
             public void parse(char[] buffer, int start, int length, DataOutput out) throws HyracksDataException {
                 charArrayAccessor.reset(buffer, start, length);
                 try {
-                    out.writeInt((int) (parseDatePart(charArrayAccessor, true) / GregorianCalendarSystem.CHRONON_OF_DAY));
+                    out.writeInt((int) (parseDatePart(charArrayAccessor) / GregorianCalendarSystem.CHRONON_OF_DAY));
                 } catch (IOException ex) {
                     throw new HyracksDataException(ex);
                 }
@@ -63,7 +63,7 @@
      * @return
      * @throws Exception
      */
-    public static <T> long parseDatePart(ICharSequenceAccessor<T> charAccessor, boolean isDateOnly)
+    public static <T> long parseDatePart(ICharSequenceAccessor<T> charAccessor)
             throws HyracksDataException {
 
         int length = charAccessor.getLength();
@@ -79,8 +79,7 @@
             positive = false;
         }
 
-        if ((isDateOnly) && charAccessor.getCharAt(offset + 4) == '-' || (!isDateOnly)
-                && charAccessor.getCharAt(offset + 13) == ':') {
+        if (charAccessor.getCharAt(offset + 4) == '-') {
             isExtendedForm = true;
         }
 
@@ -141,9 +140,14 @@
             year *= -1;
         }
 
-        if (isDateOnly && length > offset) {
+        if (length > offset) {
             throw new HyracksDataException("Too many chars for a date only value");
         }
+        
+        if (!GregorianCalendarSystem.getInstance().validate(year, month, day, 0, 0, 0, 0)){
+            throw new HyracksDataException(dateErrorMessage);
+        }
+        
         return GregorianCalendarSystem.getInstance().getChronon(year, month, day, 0, 0, 0, 0, 0);
     }
 
diff --git a/asterix-om/src/main/java/edu/uci/ics/asterix/om/base/temporal/ADateTimeParserFactory.java b/asterix-om/src/main/java/edu/uci/ics/asterix/om/base/temporal/ADateTimeParserFactory.java
index 2df3c3b..4c05d88 100644
--- a/asterix-om/src/main/java/edu/uci/ics/asterix/om/base/temporal/ADateTimeParserFactory.java
+++ b/asterix-om/src/main/java/edu/uci/ics/asterix/om/base/temporal/ADateTimeParserFactory.java
@@ -48,18 +48,19 @@
 
                 short timeOffset = (short) ((charArrayAccessor.getCharAt(0) == '-') ? 1 : 0);
 
-                if (charArrayAccessor.getCharAt(timeOffset + 10) != 'T'
-                        && charArrayAccessor.getCharAt(timeOffset + 8) != 'T') {
-                    throw new HyracksDataException(dateTimeErrorMessage + ": missing T");
+                timeOffset += 8;
+
+                if (charArrayAccessor.getCharAt(timeOffset) != 'T') {
+                    timeOffset += 2;
+                    if (charArrayAccessor.getCharAt(timeOffset) != 'T') {
+                        throw new HyracksDataException(dateTimeErrorMessage + ": missing T");
+                    }
                 }
 
-                // if extended form 11, else 9
-                timeOffset += (charArrayAccessor.getCharAt(timeOffset + 13) == ':') ? (short) (11) : (short) (9);
-
-                chrononTimeInMs = ADateParserFactory.parseDatePart(charArrayAccessor, false);
+                charArrayAccessor.reset(buffer, start, timeOffset);
+                chrononTimeInMs = ADateParserFactory.parseDatePart(charArrayAccessor);
 
                 charArrayAccessor.reset(buffer, start + timeOffset, length - timeOffset);
-
                 chrononTimeInMs += ATimeParserFactory.parseTimePart(charArrayAccessor);
 
                 try {
diff --git a/asterix-om/src/main/java/edu/uci/ics/asterix/om/base/temporal/GregorianCalendarSystem.java b/asterix-om/src/main/java/edu/uci/ics/asterix/om/base/temporal/GregorianCalendarSystem.java
index d43f235..f74af9b 100644
--- a/asterix-om/src/main/java/edu/uci/ics/asterix/om/base/temporal/GregorianCalendarSystem.java
+++ b/asterix-om/src/main/java/edu/uci/ics/asterix/om/base/temporal/GregorianCalendarSystem.java
@@ -135,11 +135,11 @@
         // Check whether leap month.
         if (month == 2) {
             if (isLeapYear(year)) {
-                if (month > DAYS_OF_MONTH_LEAP[1]) {
+                if (day > DAYS_OF_MONTH_LEAP[1]) {
                     return false;
                 }
             } else {
-                if (month > DAYS_OF_MONTH_ORDI[1]) {
+                if (day > DAYS_OF_MONTH_ORDI[1]) {
                     return false;
                 }
             }
diff --git a/asterix-om/src/main/java/edu/uci/ics/asterix/om/functions/AsterixBuiltinFunctions.java b/asterix-om/src/main/java/edu/uci/ics/asterix/om/functions/AsterixBuiltinFunctions.java
index a547737..e8a9719 100644
--- a/asterix-om/src/main/java/edu/uci/ics/asterix/om/functions/AsterixBuiltinFunctions.java
+++ b/asterix-om/src/main/java/edu/uci/ics/asterix/om/functions/AsterixBuiltinFunctions.java
@@ -448,7 +448,7 @@
     public static final FunctionIdentifier ACCESSOR_TEMPORAL_YEAR = new FunctionIdentifier(
             FunctionConstants.ASTERIX_NS, "year", 1);
     public static final FunctionIdentifier ACCESSOR_TEMPORAL_MONTH = new FunctionIdentifier(
-            FunctionConstants.ASTERIX_NS, "month", 2);
+            FunctionConstants.ASTERIX_NS, "month", 1);
     public static final FunctionIdentifier ACCESSOR_TEMPORAL_DAY = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
             "day", 1);
     public static final FunctionIdentifier ACCESSOR_TEMPORAL_HOUR = new FunctionIdentifier(
diff --git a/asterix-om/src/main/java/edu/uci/ics/asterix/om/pointables/printer/APrintVisitor.java b/asterix-om/src/main/java/edu/uci/ics/asterix/om/pointables/printer/APrintVisitor.java
index 3664804..b78308d 100644
--- a/asterix-om/src/main/java/edu/uci/ics/asterix/om/pointables/printer/APrintVisitor.java
+++ b/asterix-om/src/main/java/edu/uci/ics/asterix/om/pointables/printer/APrintVisitor.java
@@ -31,6 +31,7 @@
 import edu.uci.ics.asterix.dataflow.data.nontagged.printers.AInt32Printer;
 import edu.uci.ics.asterix.dataflow.data.nontagged.printers.AInt64Printer;
 import edu.uci.ics.asterix.dataflow.data.nontagged.printers.AInt8Printer;
+import edu.uci.ics.asterix.dataflow.data.nontagged.printers.AIntervalPrinter;
 import edu.uci.ics.asterix.dataflow.data.nontagged.printers.ALinePrinter;
 import edu.uci.ics.asterix.dataflow.data.nontagged.printers.ANullPrinter;
 import edu.uci.ics.asterix.dataflow.data.nontagged.printers.APoint3DPrinter;
@@ -173,6 +174,10 @@
                     AStringPrinter.INSTANCE.print(b, s, l, ps);
                     break;
                 }
+                case INTERVAL: {
+                    AIntervalPrinter.INSTANCE.print(b, s, l, ps);
+                    break;
+                }
                 default: {
                     throw new NotImplementedException("No printer for type " + typeTag);
                 }
diff --git a/asterix-om/src/main/java/edu/uci/ics/asterix/om/types/ATypeTag.java b/asterix-om/src/main/java/edu/uci/ics/asterix/om/types/ATypeTag.java
index e69fbcd..a0ad3e1 100644
--- a/asterix-om/src/main/java/edu/uci/ics/asterix/om/types/ATypeTag.java
+++ b/asterix-om/src/main/java/edu/uci/ics/asterix/om/types/ATypeTag.java
@@ -42,9 +42,9 @@
     LINE(30),
     POLYGON(31),
     CIRCLE(32),
-    INTERVAL(34),
     RECTANGLE(33),
-    SYSTEM_NULL(34);
+    INTERVAL(34),
+    SYSTEM_NULL(35);
 
     private byte value;
 
diff --git a/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/constructors/ADateConstructorDescriptor.java b/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/constructors/ADateConstructorDescriptor.java
index 44fcf7c..d5d703d 100644
--- a/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/constructors/ADateConstructorDescriptor.java
+++ b/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/constructors/ADateConstructorDescriptor.java
@@ -86,8 +86,17 @@
 
                                 int stringLength = (serString[1] & 0xff << 8) + (serString[2] & 0xff << 0);
 
-                                charAccessor.reset(serString, 3, stringLength);
-                                long chrononTimeInMs = ADateParserFactory.parseDatePart(charAccessor, true);
+                                int startOffset = 3;
+                                while (serString[startOffset] == ' ') {
+                                    startOffset++;
+                                }
+                                int endOffset = stringLength - 1 + 3;
+                                while (serString[endOffset] == ' ') {
+                                    endOffset--;
+                                }
+
+                                charAccessor.reset(serString, startOffset, endOffset - startOffset + 1);
+                                long chrononTimeInMs = ADateParserFactory.parseDatePart(charAccessor);
 
                                 short temp = 0;
                                 if (chrononTimeInMs < 0
diff --git a/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/constructors/ADateTimeConstructorDescriptor.java b/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/constructors/ADateTimeConstructorDescriptor.java
index 6a5783b..104dc32 100644
--- a/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/constructors/ADateTimeConstructorDescriptor.java
+++ b/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/constructors/ADateTimeConstructorDescriptor.java
@@ -85,23 +85,39 @@
 
                                 int stringLength = (serString[1] & 0xff << 8) + (serString[2] & 0xff << 0);
 
-                                charAccessor.reset(serString, 3, stringLength);
+                                int startOffset = 3;
+                                int endOffset = stringLength - 1 + 3;
+
+                                // skip leading space
+                                while (serString[startOffset] == ' ') {
+                                    startOffset++;
+                                }
+
+                                // skip tailing space
+                                while (serString[endOffset] == ' ') {
+                                    endOffset--;
+                                }
+
+                                charAccessor.reset(serString, startOffset, endOffset - startOffset + 1);
 
                                 // +1 if it is negative (-)
                                 short timeOffset = (short) ((charAccessor.getCharAt(0) == '-') ? 1 : 0);
 
-                                if (charAccessor.getCharAt(timeOffset + 10) != 'T'
-                                        && charAccessor.getCharAt(timeOffset + 8) != 'T') {
-                                    throw new AlgebricksException(errorMessage + ": missing T");
+                                timeOffset += 8;
+
+                                if (charAccessor.getCharAt(timeOffset) != 'T') {
+                                    timeOffset += 2;
+                                    if (charAccessor.getCharAt(timeOffset) != 'T') {
+                                        throw new AlgebricksException(errorMessage + ": missing T");
+                                    }
                                 }
 
-                                // if extended form 11, else 9
-                                timeOffset += (charAccessor.getCharAt(timeOffset + 13) == ':') ? (short) (11)
-                                        : (short) (9);
+                                charAccessor.reset(serString, startOffset, timeOffset);
 
-                                long chrononTimeInMs = ADateParserFactory.parseDatePart(charAccessor, false);
+                                long chrononTimeInMs = ADateParserFactory.parseDatePart(charAccessor);
 
-                                charAccessor.reset(serString, 3 + timeOffset, stringLength - timeOffset);
+                                charAccessor.reset(serString, startOffset + timeOffset + 1, endOffset
+                                        - (startOffset + timeOffset + 1) + 1);
 
                                 chrononTimeInMs += ATimeParserFactory.parseTimePart(charAccessor);
 
diff --git a/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/constructors/AIntervalFromDateConstructorDescriptor.java b/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/constructors/AIntervalFromDateConstructorDescriptor.java
index e1a12f8..3ac64f3 100644
--- a/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/constructors/AIntervalFromDateConstructorDescriptor.java
+++ b/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/constructors/AIntervalFromDateConstructorDescriptor.java
@@ -101,15 +101,15 @@
 
                                 // start date
                                 charAccessor.reset(argOut0.getByteArray(), 3, stringLength);
-                                long intervalStart = ADateParserFactory.parseDatePart(charAccessor, true)
+                                long intervalStart = ADateParserFactory.parseDatePart(charAccessor)
                                         / GregorianCalendarSystem.CHRONON_OF_DAY;
-                                // end date
 
+                                // end date
                                 stringLength = (argOut1.getByteArray()[1] & 0xff << 8)
                                         + (argOut1.getByteArray()[2] & 0xff << 0);
 
                                 charAccessor.reset(argOut1.getByteArray(), 3, stringLength);
-                                long intervalEnd = ADateParserFactory.parseDatePart(charAccessor, true)
+                                long intervalEnd = ADateParserFactory.parseDatePart(charAccessor)
                                         / GregorianCalendarSystem.CHRONON_OF_DAY;
 
                                 if (intervalEnd < intervalStart) {
diff --git a/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/constructors/AIntervalFromDateTimeConstructorDescriptor.java b/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/constructors/AIntervalFromDateTimeConstructorDescriptor.java
index 72a8e37..35d1a02 100644
--- a/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/constructors/AIntervalFromDateTimeConstructorDescriptor.java
+++ b/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/constructors/AIntervalFromDateTimeConstructorDescriptor.java
@@ -95,46 +95,46 @@
                                 nullSerde.serialize(ANull.NULL, out);
                             } else if (argOut0.getByteArray()[0] == SER_STRING_TYPE_TAG
                                     && argOut1.getByteArray()[0] == SER_STRING_TYPE_TAG) {
-                                // start date
-
+                                // start datetime
                                 int stringLength = (argOut0.getByteArray()[1] & 0xff << 8)
                                         + (argOut0.getByteArray()[2] & 0xff << 0);
 
                                 charAccessor.reset(argOut0.getByteArray(), 3, stringLength);
                                 // get offset for time part: +1 if it is negative (-)
                                 short timeOffset = (short) ((charAccessor.getCharAt(0) == '-') ? 1 : 0);
-
-                                if (charAccessor.getCharAt(timeOffset + 10) != 'T'
-                                        && charAccessor.getCharAt(timeOffset + 8) != 'T') {
-                                    throw new AlgebricksException(errorMessage + ": missing T");
+                                timeOffset += 8;
+                                if (charAccessor.getCharAt(timeOffset) != 'T') {
+                                    timeOffset += 2;
+                                    if (charAccessor.getCharAt(timeOffset) != 'T') {
+                                        throw new AlgebricksException(errorMessage + ": missing T");
+                                    }
                                 }
 
-                                // if extended form 11, else 9
-                                timeOffset += (charAccessor.getCharAt(timeOffset + 13) == ':') ? (short) (11)
-                                        : (short) (9);
-                                long intervalStart = ADateParserFactory.parseDatePart(charAccessor, false);
-                                charAccessor.reset(argOut0.getByteArray(), 3 + timeOffset, stringLength - timeOffset);
+                                charAccessor.reset(argOut0.getByteArray(), 3, timeOffset);
+                                long intervalStart = ADateParserFactory.parseDatePart(charAccessor);
+                                charAccessor.reset(argOut0.getByteArray(), 3 + timeOffset + 1, stringLength
+                                        - timeOffset - 1);
                                 intervalStart += ATimeParserFactory.parseTimePart(charAccessor);
 
-                                // end date
-
+                                // end datetime
                                 stringLength = (argOut1.getByteArray()[1] & 0xff << 8)
                                         + (argOut1.getByteArray()[2] & 0xff << 0);
 
                                 charAccessor.reset(argOut1.getByteArray(), 3, stringLength);
                                 // get offset for time part: +1 if it is negative (-)
                                 timeOffset = (short) ((charAccessor.getCharAt(0) == '-') ? 1 : 0);
-
-                                if (charAccessor.getCharAt(timeOffset + 10) != 'T'
-                                        && charAccessor.getCharAt(timeOffset + 8) != 'T') {
-                                    throw new AlgebricksException(errorMessage + ": missing T");
+                                timeOffset += 8;
+                                if (charAccessor.getCharAt(timeOffset) != 'T') {
+                                    timeOffset += 2;
+                                    if (charAccessor.getCharAt(timeOffset) != 'T') {
+                                        throw new AlgebricksException(errorMessage + ": missing T");
+                                    }
                                 }
 
-                                // if extended form 11, else 9
-                                timeOffset += (charAccessor.getCharAt(timeOffset + 13) == ':') ? (short) (11)
-                                        : (short) (9);
-                                long intervalEnd = ADateParserFactory.parseDatePart(charAccessor, false);
-                                charAccessor.reset(argOut1.getByteArray(), 3 + timeOffset, stringLength - timeOffset);
+                                charAccessor.reset(argOut1.getByteArray(), 3, timeOffset);
+                                long intervalEnd = ADateParserFactory.parseDatePart(charAccessor);
+                                charAccessor.reset(argOut1.getByteArray(), 3 + timeOffset + 1, stringLength
+                                        - timeOffset - 1);
                                 intervalEnd += ATimeParserFactory.parseTimePart(charAccessor);
 
                                 if (intervalEnd < intervalStart) {
diff --git a/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/constructors/AIntervalFromTimeConstructorDescriptor.java b/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/constructors/AIntervalFromTimeConstructorDescriptor.java
index 3ce722a..73080c8 100644
--- a/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/constructors/AIntervalFromTimeConstructorDescriptor.java
+++ b/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/constructors/AIntervalFromTimeConstructorDescriptor.java
@@ -96,7 +96,6 @@
                             } else if (argOut0.getByteArray()[0] == SER_STRING_TYPE_TAG
                                     && argOut1.getByteArray()[0] == SER_STRING_TYPE_TAG) {
                                 // start date
-
                                 int stringLength = (argOut0.getByteArray()[1] & 0xff << 8)
                                         + (argOut0.getByteArray()[2] & 0xff << 0);
 
@@ -107,7 +106,6 @@
                                 }
 
                                 // end date
-
                                 stringLength = (argOut1.getByteArray()[1] & 0xff << 8)
                                         + (argOut1.getByteArray()[2] & 0xff << 0);
 
diff --git a/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/constructors/AIntervalStartFromDateConstructorDescriptor.java b/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/constructors/AIntervalStartFromDateConstructorDescriptor.java
index 23fdb07..6429daa 100644
--- a/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/constructors/AIntervalStartFromDateConstructorDescriptor.java
+++ b/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/constructors/AIntervalStartFromDateConstructorDescriptor.java
@@ -99,15 +99,15 @@
                                 nullSerde.serialize(ANull.NULL, out);
                             } else if (argOut0.getByteArray()[0] == SER_STRING_TYPE_TAG
                                     && argOut1.getByteArray()[0] == SER_STRING_TYPE_TAG) {
-                                // start date
 
+                                // start date
                                 int stringLength = (argOut0.getByteArray()[1] & 0xff << 8)
                                         + (argOut0.getByteArray()[2] & 0xff << 0);
 
                                 charAccessor.reset(argOut0.getByteArray(), 3, stringLength);
-                                long intervalStart = ADateParserFactory.parseDatePart(charAccessor, true);
-                                // duration
+                                long intervalStart = ADateParserFactory.parseDatePart(charAccessor);
 
+                                // duration
                                 stringLength = (argOut1.getByteArray()[1] & 0xff << 8)
                                         + (argOut1.getByteArray()[2] & 0xff << 0);
 
diff --git a/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/constructors/AIntervalStartFromDateTimeConstructorDescriptor.java b/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/constructors/AIntervalStartFromDateTimeConstructorDescriptor.java
index 91c45df..92469f0 100644
--- a/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/constructors/AIntervalStartFromDateTimeConstructorDescriptor.java
+++ b/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/constructors/AIntervalStartFromDateTimeConstructorDescriptor.java
@@ -108,20 +108,20 @@
                                 // get offset for time part: +1 if it is negative (-)
                                 short timeOffset = (short) ((charAccessor.getCharAt(0) == '-') ? 1 : 0);
 
-                                if (charAccessor.getCharAt(timeOffset + 10) != 'T'
-                                        && charAccessor.getCharAt(timeOffset + 8) != 'T') {
-                                    throw new AlgebricksException(errorMessage + ": missing T");
+                                timeOffset += 8;
+
+                                if (charAccessor.getCharAt(timeOffset) != 'T') {
+                                    timeOffset += 2;
+                                    if (charAccessor.getCharAt(timeOffset) != 'T') {
+                                        throw new AlgebricksException(errorMessage + ": missing T");
+                                    }
                                 }
 
-                                // if extended form 11, else 9
-                                timeOffset += (charAccessor.getCharAt(timeOffset + 13) == ':') ? (short) (11)
-                                        : (short) (9);
-                                long intervalStart = ADateParserFactory.parseDatePart(charAccessor, false);
-                                charAccessor.reset(argOut0.getByteArray(), 3 + timeOffset, stringLength - timeOffset);
+                                long intervalStart = ADateParserFactory.parseDatePart(charAccessor);
+                                charAccessor.reset(argOut0.getByteArray(), 3 + timeOffset + 1, stringLength - timeOffset - 1);
                                 intervalStart += ATimeParserFactory.parseTimePart(charAccessor);
 
                                 // duration
-
                                 stringLength = (argOut1.getByteArray()[1] & 0xff << 8)
                                         + (argOut1.getByteArray()[2] & 0xff << 0);
 
diff --git a/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/operators/file/ADMDataParser.java b/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/operators/file/ADMDataParser.java
index 2e64ad4..b32110b 100644
--- a/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/operators/file/ADMDataParser.java
+++ b/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/operators/file/ADMDataParser.java
@@ -234,7 +234,7 @@
                 try {
                     if (checkType(ATypeTag.INTERVAL, objectType, out)) {
                         if (admLexer.next() == AdmLexer.TOKEN_CONSTRUCTOR_OPEN) {
-                            if (admLexer.next() == AdmLexer.TOKEN_STRING_CONS) {
+                            if (admLexer.next() == AdmLexer.TOKEN_STRING_LITERAL) {
                                 AIntervalSerializerDeserializer.parseDate(admLexer.getLastTokenImage(), out);
 
                                 if (admLexer.next() == AdmLexer.TOKEN_CONSTRUCTOR_CLOSE) {
@@ -252,7 +252,7 @@
                 try {
                     if (checkType(ATypeTag.INTERVAL, objectType, out)) {
                         if (admLexer.next() == AdmLexer.TOKEN_CONSTRUCTOR_OPEN) {
-                            if (admLexer.next() == AdmLexer.TOKEN_STRING_CONS) {
+                            if (admLexer.next() == AdmLexer.TOKEN_STRING_LITERAL) {
                                 AIntervalSerializerDeserializer.parseTime(admLexer.getLastTokenImage(), out);
 
                                 if (admLexer.next() == AdmLexer.TOKEN_CONSTRUCTOR_CLOSE) {
@@ -270,7 +270,7 @@
                 try {
                     if (checkType(ATypeTag.INTERVAL, objectType, out)) {
                         if (admLexer.next() == AdmLexer.TOKEN_CONSTRUCTOR_OPEN) {
-                            if (admLexer.next() == AdmLexer.TOKEN_STRING_CONS) {
+                            if (admLexer.next() == AdmLexer.TOKEN_STRING_LITERAL) {
                                 AIntervalSerializerDeserializer.parseDatetime(admLexer.getLastTokenImage(), out);
 
                                 if (admLexer.next() == AdmLexer.TOKEN_CONSTRUCTOR_CLOSE) {
diff --git a/asterix-runtime/src/main/resources/adm.grammar b/asterix-runtime/src/main/resources/adm.grammar
index 56c7212..4d4158f 100644
--- a/asterix-runtime/src/main/resources/adm.grammar
+++ b/asterix-runtime/src/main/resources/adm.grammar
@@ -26,9 +26,9 @@
 RECTANGLE_CONS = string(rectangle)
 CIRCLE_CONS    = string(circle)
 TIME_CONS      = string(time)
-INTERVAL_TIME_CONS      = string(interval_time)
-INTERVAL_DATE_CONS      = string(interval_date)
-INTERVAL_DATETIME_CONS  = string(interval_datetime)
+INTERVAL_TIME_CONS      = string(interval-time)
+INTERVAL_DATE_CONS      = string(interval-date)
+INTERVAL_DATETIME_CONS  = string(interval-datetime)
 
 NULL_LITERAL   = string(null)
 TRUE_LITERAL   = string(true)