You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tajo.apache.org by ji...@apache.org on 2014/05/22 03:33:42 UTC

[6/6] git commit: TAJO-825: Datetime type refactoring. (Hyoungjun Kim via jihoon)

TAJO-825: Datetime type refactoring. (Hyoungjun Kim via jihoon)


Project: http://git-wip-us.apache.org/repos/asf/tajo/repo
Commit: http://git-wip-us.apache.org/repos/asf/tajo/commit/526dca28
Tree: http://git-wip-us.apache.org/repos/asf/tajo/tree/526dca28
Diff: http://git-wip-us.apache.org/repos/asf/tajo/diff/526dca28

Branch: refs/heads/master
Commit: 526dca28b50d10973735accc87adc787de2db09d
Parents: 98f142c
Author: Jihoon Son <ji...@apache.org>
Authored: Thu May 22 10:32:26 2014 +0900
Committer: Jihoon Son <ji...@apache.org>
Committed: Thu May 22 10:32:26 2014 +0900

----------------------------------------------------------------------
 CHANGES                                         |    2 +
 .../org/apache/tajo/catalog/CatalogServer.java  |    8 +-
 .../org/apache/tajo/jdbc/TajoResultSetBase.java |   23 +-
 .../java/org/apache/tajo/conf/TajoConf.java     |   80 +-
 .../java/org/apache/tajo/datum/DateDatum.java   |  231 +-
 .../org/apache/tajo/datum/DatumFactory.java     |   69 +-
 .../java/org/apache/tajo/datum/Float4Datum.java |   12 +-
 .../java/org/apache/tajo/datum/Float8Datum.java |   12 +-
 .../java/org/apache/tajo/datum/Int2Datum.java   |   12 +-
 .../java/org/apache/tajo/datum/Int4Datum.java   |   12 +-
 .../java/org/apache/tajo/datum/Int8Datum.java   |   12 +-
 .../org/apache/tajo/datum/IntervalDatum.java    |   43 +-
 .../java/org/apache/tajo/datum/TimeDatum.java   |  124 +-
 .../org/apache/tajo/datum/TimestampDatum.java   |  255 ++-
 .../exception/ValueOutOfRangeException.java     |   25 +
 .../java/org/apache/tajo/json/DatumAdapter.java |    5 +-
 .../org/apache/tajo/util/TimeStampUtil.java     |   66 -
 .../tajo/util/datetime/DateTimeConstants.java   |  631 ++++++
 .../tajo/util/datetime/DateTimeFormat.java      | 2143 ++++++++++++++++++
 .../apache/tajo/util/datetime/DateTimeUtil.java | 2102 +++++++++++++++++
 .../org/apache/tajo/util/datetime/TimeMeta.java |  154 ++
 .../org/apache/tajo/datum/TestDateDatum.java    |    7 -
 .../apache/tajo/datum/TestIntervalDatum.java    |   77 +-
 .../org/apache/tajo/datum/TestTimeDatum.java    |    7 -
 .../apache/tajo/datum/TestTimestampDatum.java   |  121 +-
 .../apache/tajo/util/TestDateTimeFormat.java    |  158 ++
 .../org/apache/tajo/util/TestDateTimeUtil.java  |  439 ++++
 .../org/apache/tajo/util/TestTimeStampUtil.java |   75 -
 .../function/datetime/DatePartFromDate.java     |    9 +-
 .../function/datetime/DatePartFromTime.java     |   43 +-
 .../datetime/DatePartFromTimestamp.java         |   90 +-
 .../datetime/DateTimePartFromUnixTimeStamp.java |  166 +-
 .../function/datetime/ToCharTimestamp.java      |   28 +-
 .../tajo/engine/function/datetime/ToDate.java   |   23 +-
 .../engine/function/datetime/ToTimestamp.java   |   55 -
 .../function/datetime/ToTimestampInt.java       |   55 +
 .../function/datetime/ToTimestampText.java      |   62 +
 .../tajo/engine/planner/ExprAnnotator.java      |   43 +-
 .../engine/planner/UniformRangePartition.java   |    4 +-
 .../apache/tajo/engine/eval/ExprTestBase.java   |   21 +-
 .../tajo/engine/eval/TestIntervalType.java      |   62 +-
 .../tajo/engine/eval/TestSQLDateTimeTypes.java  |   16 +-
 .../tajo/engine/eval/TestSQLExpression.java     |   28 +-
 .../engine/function/TestDateTimeFunctions.java  |  164 +-
 .../apache/tajo/engine/query/TestSortQuery.java |   21 +-
 .../storage/TextSerializerDeserializer.java     |   15 +-
 .../org/apache/tajo/storage/TestStorages.java   |    2 +-
 47 files changed, 6901 insertions(+), 911 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tajo/blob/526dca28/CHANGES
----------------------------------------------------------------------
diff --git a/CHANGES b/CHANGES
index 8281614..5645b13 100644
--- a/CHANGES
+++ b/CHANGES
@@ -15,6 +15,8 @@ Release 0.9.0 - unreleased
 
   IMPROVEMENT
 
+    TAJO-825: Datetime type refactoring. (Hyoungjun Kim via jihoon)
+
     TAJO-811: add simple fifo scheduler support. (jinho)
 
     TAJO-801: Multiple distinct should be supported. (Hyoungjun Kim via hyunsik)

http://git-wip-us.apache.org/repos/asf/tajo/blob/526dca28/tajo-catalog/tajo-catalog-server/src/main/java/org/apache/tajo/catalog/CatalogServer.java
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-server/src/main/java/org/apache/tajo/catalog/CatalogServer.java b/tajo-catalog/tajo-catalog-server/src/main/java/org/apache/tajo/catalog/CatalogServer.java
index c0f6d36..4e391aa 100644
--- a/tajo-catalog/tajo-catalog-server/src/main/java/org/apache/tajo/catalog/CatalogServer.java
+++ b/tajo-catalog/tajo-catalog-server/src/main/java/org/apache/tajo/catalog/CatalogServer.java
@@ -864,10 +864,12 @@ public class CatalogServer extends AbstractService {
        * to implement compareTo so decided to take the shortcut.
        *
        * */
-      for (FunctionDescProto existing : functions.get(signature)) {
-        if (existing.getParameterTypesList() != null &&
+      if (functions.containsKey(signature)) {
+        for (FunctionDescProto existing : functions.get(signature)) {
+          if (existing.getParameterTypesList() != null &&
               CatalogUtil.isMatchedFunction(existing.getParameterTypesList(), params)) {
-          return existing;
+            return existing;
+          }
         }
       }
       return null;

http://git-wip-us.apache.org/repos/asf/tajo/blob/526dca28/tajo-client/src/main/java/org/apache/tajo/jdbc/TajoResultSetBase.java
----------------------------------------------------------------------
diff --git a/tajo-client/src/main/java/org/apache/tajo/jdbc/TajoResultSetBase.java b/tajo-client/src/main/java/org/apache/tajo/jdbc/TajoResultSetBase.java
index 4c307b3..60eb2f1 100644
--- a/tajo-client/src/main/java/org/apache/tajo/jdbc/TajoResultSetBase.java
+++ b/tajo-client/src/main/java/org/apache/tajo/jdbc/TajoResultSetBase.java
@@ -20,8 +20,11 @@ package org.apache.tajo.jdbc;
 
 import org.apache.tajo.catalog.Schema;
 import org.apache.tajo.common.TajoDataTypes;
+import org.apache.tajo.conf.TajoConf;
 import org.apache.tajo.datum.Datum;
 import org.apache.tajo.datum.NullDatum;
+import org.apache.tajo.datum.TimeDatum;
+import org.apache.tajo.datum.TimestampDatum;
 import org.apache.tajo.storage.Tuple;
 
 import java.io.IOException;
@@ -178,6 +181,12 @@ public abstract class TajoResultSetBase implements ResultSet {
       case FLOAT4:  return d.asFloat4();
       case FLOAT8:  return d.asFloat8();
       case NUMERIC:  return d.asFloat8();
+      case TIME: {
+        return ((TimeDatum)d).asChars(TajoConf.getCurrentTimeZone(), false);
+      }
+      case TIMESTAMP: {
+        return ((TimestampDatum)d).asChars(TajoConf.getCurrentTimeZone(), false);
+      }
       default: return d.asChars();
     }
   }
@@ -212,7 +221,19 @@ public abstract class TajoResultSetBase implements ResultSet {
   public String getString(String name) throws SQLException {
     Datum datum = cur.get(findColumn(name));
     handleNull(datum);
-    return datum.asChars();
+
+    TajoDataTypes.Type dataType = datum.type();
+
+    switch(dataType) {
+      case TIME: {
+        return ((TimeDatum)datum).asChars(TajoConf.getCurrentTimeZone(), false);
+      }
+      case TIMESTAMP: {
+        return ((TimestampDatum)datum).asChars(TajoConf.getCurrentTimeZone(), false);
+      }
+      default :
+        return datum.asChars();
+    }
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/tajo/blob/526dca28/tajo-common/src/main/java/org/apache/tajo/conf/TajoConf.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/conf/TajoConf.java b/tajo-common/src/main/java/org/apache/tajo/conf/TajoConf.java
index 6580525..b62b246 100644
--- a/tajo-common/src/main/java/org/apache/tajo/conf/TajoConf.java
+++ b/tajo-common/src/main/java/org/apache/tajo/conf/TajoConf.java
@@ -25,14 +25,24 @@ import org.apache.hadoop.fs.Path;
 import org.apache.tajo.TajoConstants;
 import org.apache.tajo.util.NetUtils;
 import org.apache.tajo.util.TUtil;
+import org.apache.tajo.util.datetime.DateTimeConstants;
 
 import java.io.IOException;
 import java.io.PrintStream;
 import java.net.InetSocketAddress;
 import java.util.Map;
+import java.util.TimeZone;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantReadWriteLock;
 
 public class TajoConf extends Configuration {
 
+  private static TimeZone CURRENT_TIMEZONE;
+  private static int DATE_ORDER = -1;
+  private static final ReentrantReadWriteLock confLock = new ReentrantReadWriteLock();
+  private static final Lock writeLock = confLock.writeLock();
+  private static final Lock readLock = confLock.readLock();
+
   static {
     Configuration.addDefaultResource("catalog-default.xml");
     Configuration.addDefaultResource("catalog-site.xml");
@@ -40,6 +50,8 @@ public class TajoConf extends Configuration {
     Configuration.addDefaultResource("storage-site.xml");
     Configuration.addDefaultResource("tajo-default.xml");
     Configuration.addDefaultResource("tajo-site.xml");
+
+    confStaticInit();
   }
 
   private static final String EMPTY_VALUE = "";
@@ -59,6 +71,68 @@ public class TajoConf extends Configuration {
     addResource(path);
   }
 
+  private static void confStaticInit() {
+    TimeZone.setDefault(getCurrentTimeZone());
+    getDateOrder();
+  }
+
+  public static TimeZone getCurrentTimeZone() {
+    writeLock.lock();
+    try {
+      if (CURRENT_TIMEZONE == null) {
+        TajoConf tajoConf = new TajoConf();
+        CURRENT_TIMEZONE = TimeZone.getTimeZone(tajoConf.getVar(ConfVars.TAJO_TIMEZONE));
+      }
+      return CURRENT_TIMEZONE;
+    } finally {
+      writeLock.unlock();
+    }
+  }
+
+  public static TimeZone setCurrentTimeZone(TimeZone timeZone) {
+    readLock.lock();
+    try {
+      TimeZone oldTimeZone = CURRENT_TIMEZONE;
+      CURRENT_TIMEZONE = timeZone;
+      return oldTimeZone;
+    } finally {
+      readLock.unlock();
+    }
+  }
+
+  public static int getDateOrder() {
+    writeLock.lock();
+    try {
+      if (DATE_ORDER < 0) {
+        TajoConf tajoConf = new TajoConf();
+        String dateOrder = tajoConf.getVar(ConfVars.TAJO_DATE_ORDER);
+        if ("YMD".equals(dateOrder)) {
+          DATE_ORDER = DateTimeConstants.DATEORDER_YMD;
+        } else if ("DMY".equals(dateOrder)) {
+          DATE_ORDER = DateTimeConstants.DATEORDER_DMY;
+        } else if ("MDY".equals(dateOrder)) {
+          DATE_ORDER = DateTimeConstants.DATEORDER_MDY;
+        } else {
+          DATE_ORDER = DateTimeConstants.DATEORDER_YMD;
+        }
+      }
+      return DATE_ORDER;
+    } finally {
+      writeLock.unlock();
+    }
+  }
+
+  public static int setDateOrder(int dateOrder) {
+    readLock.lock();
+    try {
+      int oldDateOrder = DATE_ORDER;
+      DATE_ORDER = dateOrder;
+      return oldDateOrder;
+    } finally {
+      readLock.unlock();
+    }
+  }
+
   public static enum ConfVars {
 
     //////////////////////////////////
@@ -249,7 +323,11 @@ public class TajoConf extends Configuration {
     CLI_PRINT_PAUSE_NUM_RECORDS("tajo.cli.print.pause.num.records", 100),
     CLI_PRINT_PAUSE("tajo.cli.print.pause", true),
     CLI_PRINT_ERROR_TRACE("tajo.cli.print.error.trace", true),
-    CLI_OUTPUT_FORMATTER_CLASS("tajo.cli.output.formatter", "org.apache.tajo.cli.DefaultTajoCliOutputFormatter");
+    CLI_OUTPUT_FORMATTER_CLASS("tajo.cli.output.formatter", "org.apache.tajo.cli.DefaultTajoCliOutputFormatter"),
+
+    //TIME & DATE
+    TAJO_TIMEZONE("tajo.timezone", System.getProperty("user.timezone")),
+    TAJO_DATE_ORDER("tajo.date.order", "YMD")
     ;
 
     public final String varname;

http://git-wip-us.apache.org/repos/asf/tajo/blob/526dca28/tajo-common/src/main/java/org/apache/tajo/datum/DateDatum.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/datum/DateDatum.java b/tajo-common/src/main/java/org/apache/tajo/datum/DateDatum.java
index ad68303..10f7077 100644
--- a/tajo-common/src/main/java/org/apache/tajo/datum/DateDatum.java
+++ b/tajo-common/src/main/java/org/apache/tajo/datum/DateDatum.java
@@ -19,80 +19,83 @@
 package org.apache.tajo.datum;
 
 import org.apache.tajo.common.TajoDataTypes;
+import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.exception.InvalidCastException;
 import org.apache.tajo.exception.InvalidOperationException;
 import org.apache.tajo.util.Bytes;
-import org.joda.time.*;
-import org.joda.time.format.DateTimeFormat;
-import org.joda.time.format.DateTimeFormatter;
+import org.apache.tajo.util.datetime.DateTimeConstants.DateStyle;
+import org.apache.tajo.util.datetime.DateTimeFormat;
+import org.apache.tajo.util.datetime.DateTimeUtil;
+import org.apache.tajo.util.datetime.TimeMeta;
 
 public class DateDatum extends Datum {
   public static final int SIZE = 4;
-  /** ISO 8601/SQL standard format - ex) 1997-12-17 */
-  public static final String DEFAULT_FORMAT_STRING = "yyyy-MM-dd";
-  private static final DateTimeFormatter DEFAULT_FORMATTER = DateTimeFormat.forPattern(DEFAULT_FORMAT_STRING);
-  private final LocalDate date;
+
+  private int year;
+  private int monthOfYear;
+  private int dayOfMonth;
 
   public DateDatum(int value) {
     super(TajoDataTypes.Type.DATE);
-    date = decode(value);
-  }
+    TimeMeta tm = new TimeMeta();
+    DateTimeUtil.j2date(value, tm);
 
-  public DateDatum(int year, int month, int day) {
-    super(TajoDataTypes.Type.DATE);
-    date = new LocalDate(year, month, day);
+    year = tm.years;
+    monthOfYear = tm.monthOfYear;
+    dayOfMonth = tm.dayOfMonth;
   }
 
-  public DateDatum(String dateStr) {
-    super(TajoDataTypes.Type.DATE);
-    this.date = LocalDate.parse(dateStr, DEFAULT_FORMATTER);
-  }
-
-  public DateDatum(LocalDate date) {
-    super(TajoDataTypes.Type.DATE);
-    this.date = date;
+  public TimeMeta toTimeMeta() {
+    TimeMeta tm = new TimeMeta();
+    DateTimeUtil.j2date(DateTimeUtil.date2j(year, monthOfYear, dayOfMonth), tm);
+    return tm;
   }
 
-  public LocalDate getDate() {
-    //LocalDate is immutable
-    return date;
+  public int getCenturyOfEra() {
+    TimeMeta tm = toTimeMeta();
+    return tm.getCenturyOfEra();
   }
 
-  public DateDatum(byte [] bytes) {
-    this(Bytes.toInt(bytes));
+  public int getYear() {
+    TimeMeta tm = toTimeMeta();
+    return tm.years;
   }
 
-  public int getCenturyOfEra() {
-    return date.getCenturyOfEra();
+  public int getWeekyear() {
+    TimeMeta tm = toTimeMeta();
+    return tm.getWeekyear();
   }
 
-  public int getYear() {
-    return date.getYear();
+  public int getMonthOfYear() {
+    TimeMeta tm = toTimeMeta();
+    return tm.monthOfYear;
   }
 
-  public int getMonthOfYear() {
-    return date.getMonthOfYear();
+  public int getDayOfYear() {
+    TimeMeta tm = toTimeMeta();
+    return tm.getDayOfYear();
   }
 
-  public int getWeekyear() {
-    return date.getWeekyear();
+  public int getDayOfWeek() {
+    TimeMeta tm = toTimeMeta();
+    return tm.getDayOfWeek();
   }
 
-  public int getWeekOfWeekyear() {
-    return date.getWeekOfWeekyear();
+  public int getISODayOfWeek() {
+    TimeMeta tm = toTimeMeta();
+    return tm.getISODayOfWeek();
   }
 
-  public int getDayOfWeek() {
-    return date.getDayOfWeek();
+  public int getWeekOfYear() {
+    TimeMeta tm = toTimeMeta();
+    return tm.getWeekOfYear();
   }
 
   public int getDayOfMonth() {
-    return date.getDayOfMonth();
+    TimeMeta tm = toTimeMeta();
+    return tm.dayOfMonth;
   }
 
-  public int getDayOfYear() {
-    return date.getDayOfYear();
-  }
 
   public String toString() {
     return asChars();
@@ -104,19 +107,31 @@ public class DateDatum extends Datum {
       case INT4:
       case INT8:
       case FLOAT4:
-      case FLOAT8:
-        return new DateDatum(date.plusDays(datum.asInt2()));
-      case INTERVAL:
-        IntervalDatum interval = (IntervalDatum)datum;
-        LocalDate localDate;
+      case FLOAT8: {
+        TimeMeta tm = toTimeMeta();
+        tm.plusDays(datum.asInt4());
+        return new DateDatum(DateTimeUtil.date2j(tm.years, tm.monthOfYear, tm.dayOfMonth));
+      }
+      case INTERVAL: {
+        IntervalDatum interval = (IntervalDatum) datum;
+        TimeMeta tm = toTimeMeta();
+        tm.plusMillis(interval.getMilliSeconds());
         if (interval.getMonths() > 0) {
-          localDate = date.plusMonths(interval.getMonths());
-        } else {
-          localDate = date;
+          tm.plusMonths(interval.getMonths());
         }
-        return new TimestampDatum(localDate.toDateTimeAtStartOfDay().getMillis() + interval.getMilliSeconds());
-      case TIME:
-        return new TimestampDatum(createDateTime(date, ((TimeDatum)datum).getTime(), true));
+        DateTimeUtil.toUTCTimezone(tm);
+        return new TimestampDatum(DateTimeUtil.toJulianTimestamp(tm));
+      }
+      case TIME: {
+        TimeMeta tm1 = toTimeMeta();
+
+        TimeMeta tm2 = ((TimeDatum)datum).toTimeMeta();
+        DateTimeUtil.toUserTimezone(tm2);     //TimeDatum is UTC
+
+        tm1.plusTime(DateTimeUtil.toTime(tm2));
+        DateTimeUtil.toUTCTimezone(tm1);
+        return new TimestampDatum(DateTimeUtil.toJulianTimestamp(tm1));
+      }
       default:
         throw new InvalidOperationException(datum.type());
     }
@@ -128,68 +143,51 @@ public class DateDatum extends Datum {
       case INT4:
       case INT8:
       case FLOAT4:
-      case FLOAT8:
-        return new DateDatum(date.minusDays(datum.asInt2()));
-      case INTERVAL:
-        IntervalDatum interval = (IntervalDatum)datum;
-        LocalDate localDate;
+      case FLOAT8: {
+        TimeMeta tm = toTimeMeta();
+        tm.plusDays(0 - datum.asInt4());
+        return new DateDatum(DateTimeUtil.date2j(tm.years, tm.monthOfYear, tm.dayOfMonth));
+      }
+      case INTERVAL: {
+        IntervalDatum interval = (IntervalDatum) datum;
+        TimeMeta tm = toTimeMeta();
         if (interval.getMonths() > 0) {
-          localDate = date.minusMonths(interval.getMonths());
-        } else {
-          localDate = date;
+          tm.plusMonths(0 - interval.getMonths());
         }
-        return new TimestampDatum(localDate.toDateTimeAtStartOfDay().getMillis() - interval.getMilliSeconds());
-      case TIME:
-        return new TimestampDatum(createDateTime(date, ((TimeDatum)datum).getTime(), false));
-      case DATE:
-        return new Int4Datum(Days.daysBetween(((DateDatum)datum).date, date).getDays());
+        tm.plusMillis(0 - interval.getMilliSeconds());
+        DateTimeUtil.toUTCTimezone(tm);
+        return new TimestampDatum(DateTimeUtil.toJulianTimestamp(tm));
+      }
+      case TIME: {
+        TimeMeta tm1 = toTimeMeta();
+
+        TimeMeta tm2 = ((TimeDatum)datum).toTimeMeta();
+        DateTimeUtil.toUserTimezone(tm2);     //TimeDatum is UTC
+
+        tm1.plusTime(0 - DateTimeUtil.toTime(tm2));
+        DateTimeUtil.toUTCTimezone(tm1);
+        return new TimestampDatum(DateTimeUtil.toJulianTimestamp(tm1));
+      }
+      case DATE: {
+        TimeMeta tm1 = toTimeMeta();
+        TimeMeta tm2 = ((DateDatum) datum).toTimeMeta();
+
+        int day1 = DateTimeUtil.date2j(tm1.years, tm1.monthOfYear, tm1.dayOfMonth);
+        int day2 = DateTimeUtil.date2j(tm2.years, tm2.monthOfYear, tm2.dayOfMonth);
+        return new Int4Datum(day1 - day2);
+      }
       default:
         throw new InvalidOperationException(datum.type());
     }
   }
 
-  public static DateTime createDateTime(LocalDate date, LocalTime time, boolean plus) {
-    //TODO create too many temporary instance. This must be improved.
-    DateTime dateTime = new DateTime(date.toDate().getTime());
-    if (plus) {
-      return dateTime
-                .plusHours(time.getHourOfDay())
-                .plusMinutes(time.getMinuteOfHour())
-                .plusSeconds(time.getSecondOfMinute())
-                .plusMillis(time.getMillisOfSecond());
-    } else {
-      return dateTime
-                .minusHours(time.getHourOfDay())
-                .minusMinutes(time.getMinuteOfHour())
-                .minusSeconds(time.getSecondOfMinute())
-                .minusMillis(time.getMillisOfSecond());
-    }
-  }
-
   @Override
   public int asInt4() {
     return encode();
   }
 
-  private static LocalDate decode(int val) {
-    int year = (val >> 16);
-    int monthOfYear = (0xFFFF & val) >> 8;
-    int dayOfMonth = (0x00FF & val);
-    return new LocalDate(year, monthOfYear, dayOfMonth);
-  }
-
-  /**
-   *   Year     MonthOfYear   DayOfMonth
-   *  31-16       15-8          7 - 0
-   *
-   * 0xFF 0xFF    0xFF          0xFF
-   */
   private int encode() {
-    int instance = 0;
-    instance |= (date.getYear() << 16); // 1970 ~ : 2 bytes
-    instance |= (date.getMonthOfYear() << 8); // 1 - 12 : 1 byte
-    instance |= (date.getDayOfMonth()); // 0 - 31 : 1 byte
-    return instance;
+    return DateTimeUtil.date2j(year, monthOfYear, dayOfMonth);
   }
 
   @Override
@@ -209,11 +207,13 @@ public class DateDatum extends Datum {
 
   @Override
   public String asChars() {
-    return date.toString(DEFAULT_FORMATTER);
+    TimeMeta tm = toTimeMeta();
+    return DateTimeUtil.encodeDate(tm, DateStyle.ISO_DATES);
   }
 
   public String toChars(String format) {
-    return date.toString(format);
+    TimeMeta tm = toTimeMeta();
+    return DateTimeFormat.to_char(tm, format);
   }
 
   @Override
@@ -228,8 +228,8 @@ public class DateDatum extends Datum {
 
   @Override
   public Datum equalsTo(Datum datum) {
-    if (datum.type() == TajoDataTypes.Type.TIME) {
-      return DatumFactory.createBool(date.equals(((DateDatum) datum).date));
+    if (datum.type() == Type.DATE) {
+      return DatumFactory.createBool(equals(datum));
     } else if (datum.isNull()) {
       return datum;
     } else {
@@ -240,7 +240,17 @@ public class DateDatum extends Datum {
   @Override
   public int compareTo(Datum datum) {
     if (datum.type() == TajoDataTypes.Type.DATE) {
-      return date.compareTo(((DateDatum)datum).date);
+      DateDatum another = (DateDatum) datum;
+      int compareResult = (year < another.year) ? -1 : ((year == another.year) ? 0 : 1);
+      if (compareResult != 0) {
+        return compareResult;
+      }
+      compareResult = (monthOfYear < another.monthOfYear) ? -1 : ((monthOfYear == another.monthOfYear) ? 0 : 1);
+      if (compareResult != 0) {
+        return compareResult;
+      }
+
+      return (dayOfMonth < another.dayOfMonth) ? -1 : ((dayOfMonth == another.dayOfMonth) ? 0 : 1);
     } else if (datum instanceof NullDatum || datum.isNull()) {
       return -1;
     } else {
@@ -251,7 +261,7 @@ public class DateDatum extends Datum {
   public boolean equals(Object obj) {
     if (obj instanceof DateDatum) {
       DateDatum another = (DateDatum) obj;
-      return date.isEqual(another.date);
+      return year == another.year && monthOfYear == another.monthOfYear && dayOfMonth == another.dayOfMonth;
     } else {
       return false;
     }
@@ -259,6 +269,11 @@ public class DateDatum extends Datum {
 
   @Override
   public int hashCode() {
-    return date.hashCode();
+    int total = 157;
+    total = 23 * total + year;
+    total = 23 * total + monthOfYear;
+    total = 23 * total + dayOfMonth;
+
+    return total;
   }
 }

http://git-wip-us.apache.org/repos/asf/tajo/blob/526dca28/tajo-common/src/main/java/org/apache/tajo/datum/DatumFactory.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/datum/DatumFactory.java b/tajo-common/src/main/java/org/apache/tajo/datum/DatumFactory.java
index 5ce36e5..7d6ef18 100644
--- a/tajo-common/src/main/java/org/apache/tajo/datum/DatumFactory.java
+++ b/tajo-common/src/main/java/org/apache/tajo/datum/DatumFactory.java
@@ -23,9 +23,9 @@ import org.apache.tajo.common.TajoDataTypes.DataType;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.exception.InvalidCastException;
 import org.apache.tajo.util.Bytes;
-import org.joda.time.DateTime;
-import org.joda.time.LocalDate;
-import org.joda.time.LocalTime;
+import org.apache.tajo.util.datetime.DateTimeFormat;
+import org.apache.tajo.util.datetime.DateTimeUtil;
+import org.apache.tajo.util.datetime.TimeMeta;
 
 import java.io.IOException;
 
@@ -96,7 +96,7 @@ public class DatumFactory {
     case TIME:
       return createTime(value);
     case TIMESTAMP:
-      return createTimeStamp(value);
+      return createTimestamp(value);
     case INTERVAL:
       return createInterval(value);
     case BLOB:
@@ -128,11 +128,11 @@ public class DatumFactory {
       case TEXT:
         return createText(bytes);
       case DATE:
-        return new DateDatum(bytes);
+        return new DateDatum(Bytes.toInt(bytes));
       case TIME:
-        return new TimeDatum(bytes);
+        return new TimeDatum(Bytes.toLong(bytes));
       case TIMESTAMP:
-        return new TimestampDatum(bytes);
+        return new TimestampDatum(Bytes.toLong(bytes));
       case BIT:
         return createBit(bytes[0]);
       case BLOB:
@@ -170,7 +170,7 @@ public class DatumFactory {
     case INT8:
       return new Int8Datum(val);
     case TIMESTAMP:
-      return createTimeStampFromMillis(val);
+      return new TimestampDatum(val);
     case TIME:
       return createTime(val); 
     default:
@@ -266,8 +266,13 @@ public class DatumFactory {
     return new DateDatum(instance);
   }
 
+  public static DateDatum createDate(int year, int month, int day) {
+    return new DateDatum(DateTimeUtil.date2j(year, month, day));
+  }
+
   public static DateDatum createDate(String dateStr) {
-    return new DateDatum(LocalDate.parse(dateStr));
+    TimeMeta tm = DateTimeUtil.decodeDateTime(dateStr);
+    return new DateDatum(DateTimeUtil.date2j(tm.years, tm.monthOfYear, tm.dayOfMonth));
   }
 
   public static TimeDatum createTime(long instance) {
@@ -275,19 +280,20 @@ public class DatumFactory {
   }
 
   public static TimeDatum createTime(String dateStr) {
-    return new TimeDatum(LocalTime.parse(dateStr));
+    TimeMeta tm = DateTimeUtil.decodeDateTime(dateStr);
+    return new TimeDatum(DateTimeUtil.toTime(tm));
   }
 
-  public static TimestampDatum createTimeStamp(int unixTime) {
-    return new TimestampDatum(unixTime);
+  public static TimestampDatum createTimestmpDatumWithJavaMillis(long millis) {
+    return new TimestampDatum(DateTimeUtil.javaTimeToJulianTime(millis));
   }
 
-  public static TimestampDatum createTimeStampFromMillis(long millis) {
-    return new TimestampDatum(new DateTime(millis));
+  public static TimestampDatum createTimestmpDatumWithUnixTime(int unixTime) {
+    return createTimestmpDatumWithJavaMillis(unixTime * 1000L);
   }
 
-  public static TimestampDatum createTimeStamp(String timeStamp) {
-    return new TimestampDatum(timeStamp);
+  public static TimestampDatum createTimestamp(String datetimeStr) {
+    return new TimestampDatum(DateTimeUtil.toJulianTimestamp(datetimeStr));
   }
 
   public static IntervalDatum createInterval(String intervalStr) {
@@ -301,7 +307,7 @@ public class DatumFactory {
     case INT8:
       return new DateDatum(datum.asInt4());
     case TEXT:
-      return new DateDatum(datum.asChars());
+      return createDate(datum.asChars());
     case DATE:
       return (DateDatum) datum;
     default:
@@ -314,7 +320,9 @@ public class DatumFactory {
     case INT8:
       return new TimeDatum(datum.asInt8());
     case TEXT:
-      return new TimeDatum(datum.asChars());
+      TimeMeta tm = DateTimeFormat.parseDateTime(datum.asChars(), "HH24:MI:SS.MS");
+      DateTimeUtil.toUTCTimezone(tm);
+      return new TimeDatum(DateTimeUtil.toTime(tm));
     case TIME:
       return (TimeDatum) datum;
     default:
@@ -325,7 +333,11 @@ public class DatumFactory {
   public static TimestampDatum createTimestamp(Datum datum) {
     switch (datum.type()) {
       case TEXT:
-        return new TimestampDatum(datum.asChars());
+        long timestamp = DateTimeUtil.toJulianTimestamp(datum.asChars());
+        TimeMeta tm = new TimeMeta();
+        DateTimeUtil.toJulianTimeMeta(timestamp, tm);
+        DateTimeUtil.toUTCTimezone(tm);
+        return new TimestampDatum(DateTimeUtil.toJulianTimestamp(tm));
       case TIMESTAMP:
         return (TimestampDatum) datum;
       default:
@@ -375,7 +387,24 @@ public class DatumFactory {
     case FLOAT8:
       return DatumFactory.createFloat8(operandDatum.asFloat8());
     case TEXT:
-      return DatumFactory.createText(operandDatum.asTextBytes());
+      switch (operandDatum.type()) {
+        case TIMESTAMP: {
+          TimestampDatum timestampDatum = (TimestampDatum)operandDatum;
+          TimeMeta tm = timestampDatum.toTimeMeta();
+          DateTimeUtil.toUserTimezone(tm);
+          TimestampDatum convertedTimestampDatum = new TimestampDatum(DateTimeUtil.toJulianTimestamp(tm));
+          return DatumFactory.createText(convertedTimestampDatum.asTextBytes());
+        }
+        case TIME: {
+          TimeDatum timeDatum = (TimeDatum)operandDatum;
+          TimeMeta tm = timeDatum.toTimeMeta();
+          DateTimeUtil.toUserTimezone(tm);
+          TimeDatum convertedTimeDatum = new TimeDatum(DateTimeUtil.toTime(tm));
+          return DatumFactory.createText(convertedTimeDatum.asTextBytes());
+        }
+        default:
+          return DatumFactory.createText(operandDatum.asTextBytes());
+      }
     case DATE:
       return DatumFactory.createDate(operandDatum);
     case TIME:

http://git-wip-us.apache.org/repos/asf/tajo/blob/526dca28/tajo-common/src/main/java/org/apache/tajo/datum/Float4Datum.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/datum/Float4Datum.java b/tajo-common/src/main/java/org/apache/tajo/datum/Float4Datum.java
index 35dca00..c269a40 100644
--- a/tajo-common/src/main/java/org/apache/tajo/datum/Float4Datum.java
+++ b/tajo-common/src/main/java/org/apache/tajo/datum/Float4Datum.java
@@ -23,6 +23,8 @@ import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.exception.InvalidCastException;
 import org.apache.tajo.exception.InvalidOperationException;
 import org.apache.tajo.util.NumberUtil;
+import org.apache.tajo.util.datetime.DateTimeUtil;
+import org.apache.tajo.util.datetime.TimeMeta;
 
 import java.nio.ByteBuffer;
 
@@ -211,7 +213,10 @@ public class Float4Datum extends NumericDatum {
     case FLOAT8:
       return DatumFactory.createFloat8(val + datum.asFloat8());
     case DATE:
-      return new DateDatum(((DateDatum)datum).getDate().plusDays(asInt4()));
+      DateDatum dateDatum = (DateDatum)datum;
+      TimeMeta tm = dateDatum.toTimeMeta();
+      tm.plusDays(asInt4());
+      return new DateDatum(DateTimeUtil.date2j(tm.years, tm.monthOfYear, tm.dayOfMonth));
     case NULL_TYPE:
       return datum;
     default:
@@ -233,7 +238,10 @@ public class Float4Datum extends NumericDatum {
     case FLOAT8:
       return DatumFactory.createFloat8(val - datum.asFloat8());
     case DATE:
-      return new DateDatum(((DateDatum)datum).getDate().minusDays(asInt4()));
+      DateDatum dateDatum = (DateDatum)datum;
+      TimeMeta tm = dateDatum.toTimeMeta();
+      tm.plusDays(0 - asInt4());
+      return new DateDatum(DateTimeUtil.date2j(tm.years, tm.monthOfYear, tm.dayOfMonth));
     case NULL_TYPE:
       return datum;
     default:

http://git-wip-us.apache.org/repos/asf/tajo/blob/526dca28/tajo-common/src/main/java/org/apache/tajo/datum/Float8Datum.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/datum/Float8Datum.java b/tajo-common/src/main/java/org/apache/tajo/datum/Float8Datum.java
index b7d8cf4..b4cfc67 100644
--- a/tajo-common/src/main/java/org/apache/tajo/datum/Float8Datum.java
+++ b/tajo-common/src/main/java/org/apache/tajo/datum/Float8Datum.java
@@ -23,6 +23,8 @@ import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.exception.InvalidOperationException;
 import org.apache.tajo.util.Bytes;
 import org.apache.tajo.util.NumberUtil;
+import org.apache.tajo.util.datetime.DateTimeUtil;
+import org.apache.tajo.util.datetime.TimeMeta;
 
 import java.nio.ByteBuffer;
 
@@ -200,7 +202,10 @@ public class Float8Datum extends NumericDatum {
     case FLOAT8:
       return DatumFactory.createFloat8(val + datum.asFloat8());
     case DATE:
-      return new DateDatum(((DateDatum)datum).getDate().plusDays(asInt4()));
+      DateDatum dateDatum = (DateDatum)datum;
+      TimeMeta tm = dateDatum.toTimeMeta();
+      tm.plusDays(asInt4());
+      return new DateDatum(DateTimeUtil.date2j(tm.years, tm.monthOfYear, tm.dayOfMonth));
     case NULL_TYPE:
       return datum;
     default:
@@ -222,7 +227,10 @@ public class Float8Datum extends NumericDatum {
     case FLOAT8:
       return DatumFactory.createFloat8(val - datum.asFloat8());
     case DATE:
-      return new DateDatum(((DateDatum)datum).getDate().minusDays(asInt4()));
+      DateDatum dateDatum = (DateDatum)datum;
+      TimeMeta tm = dateDatum.toTimeMeta();
+      tm.plusDays(0 - asInt4());
+      return new DateDatum(DateTimeUtil.date2j(tm.years, tm.monthOfYear, tm.dayOfMonth));
     case NULL_TYPE:
       return datum;
     default:

http://git-wip-us.apache.org/repos/asf/tajo/blob/526dca28/tajo-common/src/main/java/org/apache/tajo/datum/Int2Datum.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/datum/Int2Datum.java b/tajo-common/src/main/java/org/apache/tajo/datum/Int2Datum.java
index 731ccdc..7770b94 100644
--- a/tajo-common/src/main/java/org/apache/tajo/datum/Int2Datum.java
+++ b/tajo-common/src/main/java/org/apache/tajo/datum/Int2Datum.java
@@ -22,6 +22,8 @@ import com.google.gson.annotations.Expose;
 import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.exception.InvalidOperationException;
 import org.apache.tajo.util.NumberUtil;
+import org.apache.tajo.util.datetime.DateTimeUtil;
+import org.apache.tajo.util.datetime.TimeMeta;
 
 import java.nio.ByteBuffer;
 
@@ -202,7 +204,10 @@ public class Int2Datum extends NumericDatum {
     case FLOAT8:
       return DatumFactory.createFloat8(val + datum.asFloat8());
     case DATE:
-      return new DateDatum(((DateDatum)datum).getDate().plusDays(asInt2()));
+      DateDatum dateDatum = (DateDatum)datum;
+      TimeMeta tm = dateDatum.toTimeMeta();
+      tm.plusDays(asInt2());
+      return new DateDatum(DateTimeUtil.date2j(tm.years, tm.monthOfYear, tm.dayOfMonth));
     case NULL_TYPE:
       return datum;
     default:
@@ -224,7 +229,10 @@ public class Int2Datum extends NumericDatum {
     case FLOAT8:
       return DatumFactory.createFloat8(val - datum.asFloat8());
     case DATE:
-      return new DateDatum(((DateDatum)datum).getDate().minusDays(asInt2()));
+      DateDatum dateDatum = (DateDatum)datum;
+      TimeMeta tm = dateDatum.toTimeMeta();
+      tm.plusDays(0 - asInt2());
+      return new DateDatum(DateTimeUtil.date2j(tm.years, tm.monthOfYear, tm.dayOfMonth));
     case NULL_TYPE:
       return datum;
     default:

http://git-wip-us.apache.org/repos/asf/tajo/blob/526dca28/tajo-common/src/main/java/org/apache/tajo/datum/Int4Datum.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/datum/Int4Datum.java b/tajo-common/src/main/java/org/apache/tajo/datum/Int4Datum.java
index 5b60e9e..7f7ac13 100644
--- a/tajo-common/src/main/java/org/apache/tajo/datum/Int4Datum.java
+++ b/tajo-common/src/main/java/org/apache/tajo/datum/Int4Datum.java
@@ -22,6 +22,8 @@ import com.google.gson.annotations.Expose;
 import org.apache.tajo.common.TajoDataTypes.Type;
 import org.apache.tajo.exception.InvalidOperationException;
 import org.apache.tajo.util.NumberUtil;
+import org.apache.tajo.util.datetime.DateTimeUtil;
+import org.apache.tajo.util.datetime.TimeMeta;
 
 import java.nio.ByteBuffer;
 
@@ -206,7 +208,10 @@ public class Int4Datum extends NumericDatum {
     case FLOAT8:
       return DatumFactory.createFloat8(val + datum.asFloat8());
     case DATE:
-      return new DateDatum(((DateDatum)datum).getDate().plusDays(asInt4()));
+      DateDatum dateDatum = (DateDatum)datum;
+      TimeMeta tm = dateDatum.toTimeMeta();
+      tm.plusDays(asInt4());
+      return new DateDatum(DateTimeUtil.date2j(tm.years, tm.monthOfYear, tm.dayOfMonth));
     case NULL_TYPE:
       return datum;
     default:
@@ -228,7 +233,10 @@ public class Int4Datum extends NumericDatum {
     case FLOAT8:
       return DatumFactory.createFloat8(val - datum.asFloat8());
     case DATE:
-        return new DateDatum(((DateDatum)datum).getDate().minusDays(asInt4()));
+      DateDatum dateDatum = (DateDatum)datum;
+      TimeMeta tm = dateDatum.toTimeMeta();
+      tm.plusDays(0 - asInt4());
+      return new DateDatum(DateTimeUtil.date2j(tm.years, tm.monthOfYear, tm.dayOfMonth));
     case NULL_TYPE:
       return datum;
     default:

http://git-wip-us.apache.org/repos/asf/tajo/blob/526dca28/tajo-common/src/main/java/org/apache/tajo/datum/Int8Datum.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/datum/Int8Datum.java b/tajo-common/src/main/java/org/apache/tajo/datum/Int8Datum.java
index 0367f9c..3b1e67d 100644
--- a/tajo-common/src/main/java/org/apache/tajo/datum/Int8Datum.java
+++ b/tajo-common/src/main/java/org/apache/tajo/datum/Int8Datum.java
@@ -23,6 +23,8 @@ import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.exception.InvalidCastException;
 import org.apache.tajo.exception.InvalidOperationException;
 import org.apache.tajo.util.NumberUtil;
+import org.apache.tajo.util.datetime.DateTimeUtil;
+import org.apache.tajo.util.datetime.TimeMeta;
 
 import java.nio.ByteBuffer;
 
@@ -214,7 +216,10 @@ public class Int8Datum extends NumericDatum {
     case FLOAT8:
       return DatumFactory.createFloat8(val + datum.asFloat8());
     case DATE:
-      return new DateDatum(((DateDatum)datum).getDate().plusDays(asInt4()));
+      DateDatum dateDatum = (DateDatum)datum;
+      TimeMeta tm = dateDatum.toTimeMeta();
+      tm.plusDays(asInt4());
+      return new DateDatum(DateTimeUtil.date2j(tm.years, tm.monthOfYear, tm.dayOfMonth));
     case NULL_TYPE:
       return datum;
     default:
@@ -236,7 +241,10 @@ public class Int8Datum extends NumericDatum {
     case FLOAT8:
       return DatumFactory.createFloat8(val - datum.asFloat8());
     case DATE:
-      return new DateDatum(((DateDatum)datum).getDate().minusDays(asInt4()));
+      DateDatum dateDatum = (DateDatum)datum;
+      TimeMeta tm = dateDatum.toTimeMeta();
+      tm.plusDays(0 - asInt4());
+      return new DateDatum(DateTimeUtil.date2j(tm.years, tm.monthOfYear, tm.dayOfMonth));
     case NULL_TYPE:
       return datum;
     default:

http://git-wip-us.apache.org/repos/asf/tajo/blob/526dca28/tajo-common/src/main/java/org/apache/tajo/datum/IntervalDatum.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/datum/IntervalDatum.java b/tajo-common/src/main/java/org/apache/tajo/datum/IntervalDatum.java
index b6904a9..5ad9635 100644
--- a/tajo-common/src/main/java/org/apache/tajo/datum/IntervalDatum.java
+++ b/tajo-common/src/main/java/org/apache/tajo/datum/IntervalDatum.java
@@ -21,9 +21,8 @@ package org.apache.tajo.datum;
 import com.google.common.base.Objects;
 import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.exception.InvalidOperationException;
-import org.joda.time.DateTime;
-import org.joda.time.LocalDate;
-import org.joda.time.LocalTime;
+import org.apache.tajo.util.datetime.DateTimeUtil;
+import org.apache.tajo.util.datetime.TimeMeta;
 
 import java.text.DecimalFormat;
 import java.util.HashMap;
@@ -231,28 +230,32 @@ public class IntervalDatum extends Datum {
       case INTERVAL:
         IntervalDatum other = (IntervalDatum) datum;
         return new IntervalDatum(months + other.months, millieconds + other.millieconds);
-      case DATE:
-        LocalDate date = ((DateDatum)datum).getDate();
-        LocalDate localDate;
-        if (months > 0) {
-          localDate = date.plusMonths(months);
-        } else {
-          localDate = date;
+      case DATE: {
+        DateDatum dateDatum = (DateDatum) datum;
+        TimeMeta tm = dateDatum.toTimeMeta();
+        tm.plusMillis(getMilliSeconds());
+        if (getMonths() > 0) {
+          tm.plusMonths(getMonths());
         }
-        return new TimestampDatum(localDate.toDateTimeAtStartOfDay().getMillis() + millieconds);
-      case TIME:
-        LocalTime localTime = ((TimeDatum)datum).getTime();
-        localTime = localTime.plusMillis((int) millieconds);
-        return new TimeDatum(localTime);
-      case TIMESTAMP:
-        DateTime dateTime = ((TimestampDatum) datum).getDateTime();
+        DateTimeUtil.toUTCTimezone(tm);
+        return new TimestampDatum(DateTimeUtil.toJulianTimestamp(tm));
+      }
+      case TIME: {
+        TimeMeta tm = ((TimeDatum) datum).toTimeMeta();
+        tm.plusMillis(millieconds);
+        return new TimeDatum(DateTimeUtil.toTime(tm));
+      }
+      case TIMESTAMP: {
+        TimeMeta tm = new TimeMeta();
+        DateTimeUtil.toJulianTimeMeta(((TimestampDatum) datum).asInt8(), tm);
         if (months > 0) {
-          dateTime = dateTime.plusMonths(months);
+          tm.plusMonths(months);
         }
         if (millieconds > 0) {
-          dateTime = dateTime.plusMillis((int) millieconds);
+          tm.plusMillis(millieconds);
         }
-        return new TimestampDatum(dateTime);
+        return new TimestampDatum(DateTimeUtil.toJulianTimestamp(tm));
+      }
       default:
         throw new InvalidOperationException(datum.type());
     }

http://git-wip-us.apache.org/repos/asf/tajo/blob/526dca28/tajo-common/src/main/java/org/apache/tajo/datum/TimeDatum.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/datum/TimeDatum.java b/tajo-common/src/main/java/org/apache/tajo/datum/TimeDatum.java
index 70f62c2..a7b9d1e 100644
--- a/tajo-common/src/main/java/org/apache/tajo/datum/TimeDatum.java
+++ b/tajo-common/src/main/java/org/apache/tajo/datum/TimeDatum.java
@@ -22,65 +22,47 @@ import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.exception.InvalidCastException;
 import org.apache.tajo.exception.InvalidOperationException;
 import org.apache.tajo.util.Bytes;
-import org.joda.time.DateTime;
-import org.joda.time.LocalTime;
-import org.joda.time.format.DateTimeFormat;
-import org.joda.time.format.DateTimeFormatter;
+import org.apache.tajo.util.datetime.DateTimeConstants.DateStyle;
+import org.apache.tajo.util.datetime.DateTimeUtil;
+import org.apache.tajo.util.datetime.TimeMeta;
+
+import java.util.TimeZone;
 
 public class TimeDatum extends Datum {
   public static final int SIZE = 8;
-  /** ISO 8601/SQL standard format - ex) 07:37:16-08 */
-  public static final String DEFAULT_FORMAT_STRING = "HH:mm:ss";
-  private static final DateTimeFormatter DEFAULT_FORMATTER = DateTimeFormat.forPattern(DEFAULT_FORMAT_STRING);
-  private final LocalTime time;
-
-  public TimeDatum(long value) {
-    super(TajoDataTypes.Type.TIME);
-    time = new LocalTime(value);
-  }
-
-  public TimeDatum(int hour, int minute, int second) {
-    super(TajoDataTypes.Type.TIME);
-    time = new LocalTime(hour, minute, second);
-  }
-
-  public TimeDatum(int hour, int minute, int second, int millis) {
-    super(TajoDataTypes.Type.TIME);
-    time = new LocalTime(hour, minute, second, millis);
-  }
+  private final long time;
 
-  public TimeDatum(String timeStr) {
-    super(TajoDataTypes.Type.TIME);
-    time = LocalTime.parse(timeStr, DEFAULT_FORMATTER);
-  }
-
-  public TimeDatum(LocalTime time) {
+  public TimeDatum(long time) {
     super(TajoDataTypes.Type.TIME);
     this.time = time;
   }
 
-  public TimeDatum(byte [] bytes) {
-    this(Bytes.toLong(bytes));
+  public TimeMeta toTimeMeta() {
+    TimeMeta tm = new TimeMeta();
+    DateTimeUtil.date2j(time, tm);
+
+    return tm;
   }
 
   public int getHourOfDay() {
-    return time.getHourOfDay();
+    TimeMeta tm = toTimeMeta();
+    return tm.hours;
   }
 
   public int getMinuteOfHour() {
-    return time.getMinuteOfHour();
+    TimeMeta tm = toTimeMeta();
+    return tm.minutes;
   }
 
   public int getSecondOfMinute() {
-    return time.getSecondOfMinute();
-  }
-
-  public int getMillisOfDay() {
-    return time.getMillisOfDay();
+    TimeMeta tm = new TimeMeta();
+    DateTimeUtil.date2j(time, tm);
+    return tm.secs;
   }
 
   public int getMillisOfSecond() {
-    return time.getMillisOfSecond();
+    TimeMeta tm = toTimeMeta();
+    return tm.fsecs / 1000;
   }
 
   public String toString() {
@@ -94,7 +76,7 @@ public class TimeDatum extends Datum {
 
   @Override
   public long asInt8() {
-    return time.toDateTimeToday().getMillis();
+    return time;
   }
 
   @Override
@@ -109,11 +91,21 @@ public class TimeDatum extends Datum {
 
   @Override
   public String asChars() {
-    return time.toString(DEFAULT_FORMATTER);
+    TimeMeta tm = toTimeMeta();
+    return DateTimeUtil.encodeTime(tm, DateStyle.ISO_DATES);
   }
 
-  public String toChars(String format) {
-    return time.toString(format);
+  public String asChars(TimeZone timeZone, boolean includeTimeZone) {
+    TimeMeta tm = toTimeMeta();
+    DateTimeUtil.toUserTimezone(tm, timeZone);
+    if (includeTimeZone) {
+      tm.timeZone = timeZone.getRawOffset() / 1000;
+    }
+    return DateTimeUtil.encodeTime(tm, DateStyle.ISO_DATES);
+  }
+
+  public String toString(TimeZone timeZone, boolean includeTimeZone) {
+    return asChars(timeZone, includeTimeZone);
   }
 
   @Override
@@ -128,12 +120,23 @@ public class TimeDatum extends Datum {
 
   public Datum plus(Datum datum) {
     switch(datum.type()) {
-      case INTERVAL:
+      case INTERVAL: {
         IntervalDatum interval = ((IntervalDatum)datum);
-        return new TimeDatum(time.plusMillis((int)interval.getMilliSeconds()));
-      case DATE:
-        DateTime dateTime = DateDatum.createDateTime(((DateDatum)datum).getDate(), time, true);
-        return new TimestampDatum(dateTime);
+        TimeMeta tm = toTimeMeta();
+        tm.plusMillis(interval.getMilliSeconds());
+        return new TimeDatum(DateTimeUtil.toTime(tm));
+      }
+      case DATE: {
+        TimeMeta tm = toTimeMeta();
+        DateTimeUtil.toUserTimezone(tm);     //TimeDatum is UTC
+
+        DateDatum dateDatum = (DateDatum) datum;
+        TimeMeta dateTm = dateDatum.toTimeMeta();
+        dateTm.plusTime(DateTimeUtil.toTime(tm));
+
+        DateTimeUtil.toUTCTimezone(dateTm);
+        return new TimestampDatum(DateTimeUtil.toJulianTimestamp(dateTm));
+      }
       default:
         throw new InvalidOperationException(datum.type());
     }
@@ -141,12 +144,17 @@ public class TimeDatum extends Datum {
 
   public Datum minus(Datum datum) {
     switch(datum.type()) {
-      case INTERVAL:
+      case INTERVAL: {
         IntervalDatum interval = ((IntervalDatum)datum);
-        return new TimeDatum(time.minusMillis((int)interval.getMilliSeconds()));
+        TimeMeta tm = toTimeMeta();
+        tm.plusMillis(0 - interval.getMilliSeconds());
+        return new TimeDatum(DateTimeUtil.toTime(tm));
+      }
       case TIME:
-        return new IntervalDatum(
-            time.toDateTimeToday().getMillis() - ((TimeDatum)datum).getTime().toDateTimeToday().getMillis() );
+        TimeMeta tm1 = toTimeMeta();
+        TimeMeta tm2 = ((TimeDatum)datum).toTimeMeta();
+
+        return new IntervalDatum((DateTimeUtil.toTime(tm1) - DateTimeUtil.toTime(tm2))/1000);
       default:
         throw new InvalidOperationException(datum.type());
     }
@@ -155,7 +163,7 @@ public class TimeDatum extends Datum {
   @Override
   public Datum equalsTo(Datum datum) {
     if (datum.type() == TajoDataTypes.Type.TIME) {
-      return DatumFactory.createBool(time.equals(((TimeDatum) datum).time));
+      return DatumFactory.createBool(time == (((TimeDatum) datum).time));
     } else if (datum.isNull()) {
       return datum;
     } else {
@@ -166,7 +174,8 @@ public class TimeDatum extends Datum {
   @Override
   public int compareTo(Datum datum) {
     if (datum.type() == TajoDataTypes.Type.TIME) {
-      return time.compareTo(((TimeDatum)datum).time);
+      TimeDatum another = (TimeDatum)datum;
+      return (time < another.time) ? -1 : ((time == another.time) ? 0 : 1);
     } else if (datum instanceof NullDatum || datum.isNull()) {
       return -1;
     } else {
@@ -177,7 +186,7 @@ public class TimeDatum extends Datum {
   public boolean equals(Object obj) {
     if (obj instanceof TimeDatum) {
       TimeDatum another = (TimeDatum) obj;
-      return time.isEqual(another.time);
+      return time == another.time;
     } else {
       return false;
     }
@@ -185,10 +194,7 @@ public class TimeDatum extends Datum {
 
   @Override
   public int hashCode() {
-    return time.hashCode();
+    return (int)(time ^ (time >>> 32));
   }
 
-  public LocalTime getTime() {
-    return time;
-  }
 }

http://git-wip-us.apache.org/repos/asf/tajo/blob/526dca28/tajo-common/src/main/java/org/apache/tajo/datum/TimestampDatum.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/datum/TimestampDatum.java b/tajo-common/src/main/java/org/apache/tajo/datum/TimestampDatum.java
index 879428b..d3cc5f4 100644
--- a/tajo-common/src/main/java/org/apache/tajo/datum/TimestampDatum.java
+++ b/tajo-common/src/main/java/org/apache/tajo/datum/TimestampDatum.java
@@ -19,187 +19,138 @@
 package org.apache.tajo.datum;
 
 import com.google.common.base.Objects;
-import org.apache.commons.lang.StringUtils;
 import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.exception.InvalidOperationException;
 import org.apache.tajo.util.Bytes;
-import org.joda.time.DateTime;
-import org.joda.time.format.DateTimeFormat;
-import org.joda.time.format.DateTimeFormatter;
+import org.apache.tajo.util.datetime.DateTimeConstants.DateStyle;
+import org.apache.tajo.util.datetime.DateTimeFormat;
+import org.apache.tajo.util.datetime.DateTimeUtil;
+import org.apache.tajo.util.datetime.TimeMeta;
+
+import java.util.TimeZone;
 
 public class TimestampDatum extends Datum {
   public static final int SIZE = 8;
-  /** ISO 8601/SQL standard format - ex) 1997-12-17 07:37:16-08 */
-  public static final String DEFAULT_FORMAT_STRING = "yyyy-MM-dd HH:mm:ss";
-  public static final String FRACTION_FORMAT_STRING = "yyyy-MM-dd HH:mm:ss.SSS";
-  private static final DateTimeFormatter DEFAULT_FORMATTER = DateTimeFormat.forPattern(DEFAULT_FORMAT_STRING);
-  private static final DateTimeFormatter FRACTION_FORMATTER = DateTimeFormat.forPattern(FRACTION_FORMAT_STRING);
-  private final DateTime dateTime;
-
-  public TimestampDatum(int timestamp) {
-    super(TajoDataTypes.Type.TIMESTAMP);
-    dateTime = new DateTime((long)timestamp * 1000);
-  }
 
+  private long timestamp;
+
+  /**
+   *
+   * @param timestamp UTC based
+   */
   public TimestampDatum(long timestamp) {
     super(TajoDataTypes.Type.TIMESTAMP);
-    dateTime = new DateTime(timestamp);
+    this.timestamp = timestamp;
   }
 
-  public TimestampDatum(DateTime dateTime) {
-    super(TajoDataTypes.Type.TIMESTAMP);
-    this.dateTime = dateTime;
+  /**
+   * It's the same value to asInt8().
+   * @return The Timestamp
+   */
+  public long getTimestamp() {
+    return timestamp;
   }
 
-  TimestampDatum(byte [] bytes) {
-    super(TajoDataTypes.Type.TIMESTAMP);
-    this.dateTime = new DateTime(Bytes.toLong(bytes));
+  public int getEpoch() {
+    return DateTimeUtil.julianTimeToEpoch(timestamp);
   }
 
-  public TimestampDatum(String datetime) {
-    super(TajoDataTypes.Type.TIMESTAMP);
-
-    DateTime tmpDateTime = null;
-    try {
-      tmpDateTime = DateTime.parse(datetime, DEFAULT_FORMATTER);
-    } catch (IllegalArgumentException e) {
-      tmpDateTime = DateTime.parse(datetime, FRACTION_FORMATTER);
-    }
-    this.dateTime = tmpDateTime;
-  }
-
-  public int getUnixTime() {
-    return (int) (dateTime.getMillis() / 1000);
+  public long getJavaTimestamp() {
+    return DateTimeUtil.julianTimeToJavaTime(timestamp);
   }
 
-  public long getMillis() {
-    return dateTime.getMillis();
-  }
-
-  public DateTime getDateTime() {
-    return dateTime;
-  }
 
   public int getCenturyOfEra() {
-    return dateTime.getCenturyOfEra();
-  }
-
-  public int getEra() {
-    return dateTime.getEra();
+    TimeMeta tm = toTimeMeta();
+    return tm.getCenturyOfEra();
   }
 
   public int getYear() {
-    return dateTime.getYear();
+    TimeMeta tm = toTimeMeta();
+    return tm.years;
   }
 
   public int getMonthOfYear() {
-    return dateTime.getMonthOfYear();
+    TimeMeta tm = toTimeMeta();
+    return tm.monthOfYear;
+  }
+
+  public int getDayOfYear() {
+    TimeMeta tm = toTimeMeta();
+    return tm.getDayOfYear();
   }
 
   public int getDayOfWeek() {
-    return dateTime.getDayOfWeek();
+    TimeMeta tm = toTimeMeta();
+    return tm.getDayOfYear();
   }
 
-  public int getDayOfYear() {
-    return dateTime.getDayOfYear();
+  public int getWeekOfYear() {
+    TimeMeta tm = toTimeMeta();
+    return tm.getWeekOfYear();
   }
 
   public int getDayOfMonth() {
-    return dateTime.getDayOfMonth();
+    TimeMeta tm = toTimeMeta();
+    return tm.dayOfMonth;
   }
 
   public int getHourOfDay() {
-    return dateTime.getHourOfDay();
+    TimeMeta tm = toTimeMeta();
+    return tm.hours;
   }
 
   public int getMinuteOfHour() {
-    return dateTime.getMinuteOfHour();
-  }
-
-  public int getSecondOfDay() {
-    return dateTime.getSecondOfDay();
+    TimeMeta tm = toTimeMeta();
+    return tm.minutes;
   }
 
   public int getSecondOfMinute() {
-    return dateTime.getSecondOfMinute();
+    TimeMeta tm = toTimeMeta();
+    return tm.secs;
   }
 
   public int getMillisOfSecond() {
-    return dateTime.getMillisOfSecond();
+    TimeMeta tm = toTimeMeta();
+    return tm.fsecs / 1000;
   }
 
-  public int getWeekyear() {
-    return dateTime.getWeekyear();
+  public int getUnixTime() {
+    return (int)(DateTimeUtil.julianTimeToJavaTime(timestamp) / 1000);
   }
 
-  public int getWeekOfWeekyear() {
-    return dateTime.getWeekOfWeekyear();
+  public String toString() {
+    return asChars();
   }
 
-  @Override
-  public Datum plus(Datum datum) {
-    if (datum.type() == TajoDataTypes.Type.INTERVAL) {
-      IntervalDatum interval = (IntervalDatum)datum;
-
-      DateTime plusDateTime = null;
-      if (interval.getMonths() > 0) {
-        plusDateTime = dateTime.plusMonths(interval.getMonths());
-      } else {
-        plusDateTime = dateTime;
-      }
-      if (interval.getMilliSeconds() > 0) {
-        plusDateTime = plusDateTime.plusMillis((int) interval.getMilliSeconds());
-      }
-      return new TimestampDatum(plusDateTime);
-
-    } else {
-      throw new InvalidOperationException(datum.type());
+  public String asChars(TimeZone timeZone, boolean includeTimeZone) {
+    TimeMeta tm = toTimeMeta();
+    DateTimeUtil.toUserTimezone(tm, timeZone);
+    if (includeTimeZone) {
+      tm.timeZone = timeZone.getRawOffset() / 1000;
     }
+    return  DateTimeUtil.encodeDateTime(tm, DateStyle.ISO_DATES);
   }
 
-  @Override
-  public Datum minus(Datum datum) {
-    switch(datum.type()) {
-      case INTERVAL:
-        IntervalDatum interval = (IntervalDatum)datum;
-
-        DateTime minusDateTime = null;
-        if (interval.getMonths() > 0) {
-          minusDateTime = dateTime.minusMonths(interval.getMonths());
-        } else {
-          minusDateTime = dateTime;
-        }
-        if (interval.getMilliSeconds() > 0) {
-          minusDateTime = minusDateTime.minusMillis((int)interval.getMilliSeconds());
-        }
-        return new TimestampDatum(minusDateTime);
-      case TIMESTAMP:
-        return new IntervalDatum(dateTime.getMillis() - ((TimestampDatum)datum).dateTime.getMillis());
-      default:
-        throw new InvalidOperationException(datum.type());
-    }
+  public String toString(TimeZone timeZone, boolean includeTimeZone) {
+    return asChars(timeZone, includeTimeZone);
   }
 
   @Override
   public long asInt8() {
-    return dateTime.getMillis();
-  }
-
-  public String toString() {
-    return asChars();
+    return timestamp;
   }
 
   @Override
   public String asChars() {
-    if (getMillisOfSecond() > 0) {
-      return StringUtils.stripEnd(dateTime.toString(FRACTION_FORMATTER), "0");
-    } else {
-      return dateTime.toString(DEFAULT_FORMATTER);
-    }
+    TimeMeta tm = toTimeMeta();
+    return DateTimeUtil.encodeDateTime(tm, DateStyle.ISO_DATES);
   }
 
-  public String toChars(DateTimeFormatter format) {
-    return dateTime.toString(format);
+  public String toChars(String format) {
+    TimeMeta tm = toTimeMeta();
+
+    return DateTimeFormat.to_char(tm, format);
   }
 
   @Override
@@ -209,43 +160,95 @@ public class TimestampDatum extends Datum {
 
   @Override
   public byte [] asByteArray() {
-    return Bytes.toBytes(dateTime.getMillis());
+    return Bytes.toBytes(timestamp);
   }
 
   @Override
   public Datum equalsTo(Datum datum) {
     if (datum.type() == TajoDataTypes.Type.TIME) {
-      return DatumFactory.createBool(dateTime.equals(((TimestampDatum) datum).dateTime));
+      return timestamp == datum.asInt8() ? BooleanDatum.TRUE : BooleanDatum.FALSE;
     } else if (datum.isNull()) {
       return datum;
     } else {
-      throw new InvalidOperationException();
+      throw new RuntimeException();
     }
   }
 
   @Override
   public int compareTo(Datum datum) {
     if (datum.type() == TajoDataTypes.Type.TIMESTAMP) {
-      return dateTime.compareTo(((TimestampDatum)datum).dateTime);
-    } else if (datum instanceof NullDatum || datum.isNull()) {
+      TimestampDatum another = (TimestampDatum) datum;
+      return (timestamp < another.timestamp) ? -1 : ((timestamp > another.timestamp) ? 1 : 0);
+    } else if (datum.isNull()) {
       return -1;
     } else {
-      throw new InvalidOperationException();
+      throw new RuntimeException();
     }
   }
 
-  @Override
   public boolean equals(Object obj) {
     if (obj instanceof TimestampDatum) {
       TimestampDatum another = (TimestampDatum) obj;
-      return dateTime.isEqual(another.dateTime);
+      return timestamp == another.timestamp;
     } else {
       return false;
     }
   }
 
   @Override
+  public Datum plus(Datum datum) {
+    if (datum.type() == TajoDataTypes.Type.INTERVAL) {
+      IntervalDatum interval = (IntervalDatum)datum;
+
+      TimeMeta tm = new TimeMeta();
+      DateTimeUtil.toJulianTimeMeta(timestamp, tm);
+
+      if (interval.getMonths() > 0) {
+        tm.plusMonths(interval.getMonths());
+      }
+      if (interval.getMilliSeconds() > 0) {
+        tm.plusMillis(interval.getMilliSeconds());
+      }
+
+      return new TimestampDatum(DateTimeUtil.toJulianTimestamp(tm));
+
+    } else {
+      throw new InvalidOperationException(datum.type());
+    }
+  }
+
+  @Override
+  public Datum minus(Datum datum) {
+    switch(datum.type()) {
+      case INTERVAL:
+        IntervalDatum interval = (IntervalDatum)datum;
+
+        TimeMeta tm = new TimeMeta();
+        DateTimeUtil.toJulianTimeMeta(timestamp, tm);
+
+        if (interval.getMonths() > 0) {
+          tm.plusMonths(0 - interval.getMonths());
+        }
+        if (interval.getMilliSeconds() > 0) {
+          tm.plusMillis(0 - interval.getMilliSeconds());
+        }
+        return new TimestampDatum(DateTimeUtil.toJulianTimestamp(tm));
+      case TIMESTAMP:
+        return new IntervalDatum((timestamp - ((TimestampDatum)datum).timestamp) / 1000);
+      default:
+        throw new InvalidOperationException(datum.type());
+    }
+  }
+
+  @Override
   public int hashCode(){
-     return Objects.hashCode(dateTime);
+     return Objects.hashCode(timestamp);
+  }
+
+  public TimeMeta toTimeMeta() {
+    TimeMeta tm = new TimeMeta();
+    DateTimeUtil.toJulianTimeMeta(timestamp, tm);
+
+    return tm;
   }
 }

http://git-wip-us.apache.org/repos/asf/tajo/blob/526dca28/tajo-common/src/main/java/org/apache/tajo/exception/ValueOutOfRangeException.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/exception/ValueOutOfRangeException.java b/tajo-common/src/main/java/org/apache/tajo/exception/ValueOutOfRangeException.java
new file mode 100644
index 0000000..4cf6b56
--- /dev/null
+++ b/tajo-common/src/main/java/org/apache/tajo/exception/ValueOutOfRangeException.java
@@ -0,0 +1,25 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.tajo.exception;
+
+public class ValueOutOfRangeException extends RuntimeException {
+  public ValueOutOfRangeException(String message) {
+    super(message);
+  }
+}

http://git-wip-us.apache.org/repos/asf/tajo/blob/526dca28/tajo-common/src/main/java/org/apache/tajo/json/DatumAdapter.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/json/DatumAdapter.java b/tajo-common/src/main/java/org/apache/tajo/json/DatumAdapter.java
index 2a162a9..9e88acb 100644
--- a/tajo-common/src/main/java/org/apache/tajo/json/DatumAdapter.java
+++ b/tajo-common/src/main/java/org/apache/tajo/json/DatumAdapter.java
@@ -21,7 +21,6 @@ package org.apache.tajo.json;
 import com.google.gson.*;
 import org.apache.tajo.common.TajoDataTypes;
 import org.apache.tajo.datum.*;
-import org.joda.time.DateTime;
 
 import java.lang.reflect.Type;
 
@@ -39,7 +38,7 @@ public class DatumAdapter implements GsonSerDerAdapter<Datum> {
     case TIME:
       return new TimeDatum(jsonObject.get("value").getAsLong());
     case TIMESTAMP:
-      return new TimestampDatum(new DateTime(jsonObject.get("value").getAsLong()));
+      return new TimestampDatum(jsonObject.get("value").getAsLong());
     case INTERVAL:
       String[] values = jsonObject.get("value").getAsString().split(",");
 
@@ -62,7 +61,7 @@ public class DatumAdapter implements GsonSerDerAdapter<Datum> {
       jsonObj.addProperty("value", src.asInt8());
       break;
     case TIMESTAMP:
-      jsonObj.addProperty("value", ((TimestampDatum)src).getMillis());
+      jsonObj.addProperty("value", src.asInt8());
       break;
     case INTERVAL:
       IntervalDatum interval = (IntervalDatum)src;

http://git-wip-us.apache.org/repos/asf/tajo/blob/526dca28/tajo-common/src/main/java/org/apache/tajo/util/TimeStampUtil.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/util/TimeStampUtil.java b/tajo-common/src/main/java/org/apache/tajo/util/TimeStampUtil.java
deleted file mode 100644
index aa1be8b..0000000
--- a/tajo-common/src/main/java/org/apache/tajo/util/TimeStampUtil.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.tajo.util;
-
-
-import org.apache.tajo.datum.Int8Datum;
-import org.joda.time.DateTime;
-import org.joda.time.DateTimeFieldType;
-import org.joda.time.DateTimeZone;
-
-public class TimeStampUtil {
-
-    public static long getDay(DateTime dateTime) {
-        return convertToMicroSeconds(dateTime.withTimeAtStartOfDay());
-    }
-
-    public static long getHour(DateTime dateTime) {
-        return convertToMicroSeconds(dateTime.withTime(dateTime.get(DateTimeFieldType.hourOfDay()), 0, 0, 0));
-    }
-
-    public static long getMinute(DateTime dateTime) {
-        return convertToMicroSeconds(dateTime.withTime(dateTime.get(DateTimeFieldType.hourOfDay()),
-            dateTime.get(DateTimeFieldType.minuteOfHour()), 0, 0));
-    }
-
-    public static long getSecond(DateTime dateTime) {
-        return convertToMicroSeconds(dateTime.withTime(dateTime.get(DateTimeFieldType.hourOfDay()),
-            dateTime.get(DateTimeFieldType.minuteOfHour()), dateTime.get(DateTimeFieldType.secondOfMinute()), 0));
-    }
-
-    public static long getMonth(DateTime dateTime) {
-        return convertToMicroSeconds(dateTime.withTimeAtStartOfDay().withDate(dateTime.getYear(),
-            dateTime.getMonthOfYear(),1));
-    }
-
-    public static long getDayOfWeek(DateTime dateTime,int week) {
-        return convertToMicroSeconds(dateTime.withTimeAtStartOfDay().withDayOfWeek(week));
-    }
-
-    public static long getYear (DateTime dateTime) {
-        return convertToMicroSeconds(dateTime.withTimeAtStartOfDay().withDate(dateTime.getYear(), 1, 1));
-    }
-
-    public static DateTime getUTCDateTime(Int8Datum int8Datum){
-        return new DateTime(int8Datum.asInt8()/1000, DateTimeZone.UTC);
-    }
-
-    public static long convertToMicroSeconds(DateTime dateTime) {
-        return  dateTime.getMillis() * 1000;
-    }
-}