Github user rxin commented on a diff in the pull request:

    https://github.com/apache/spark/pull/6981#discussion_r34861234
  
    --- Diff: 
sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/datetimeFunctions.scala
 ---
    @@ -54,3 +60,367 @@ case class CurrentTimestamp() extends LeafExpression {
         System.currentTimeMillis() * 1000L
       }
     }
    +
    +case class Hour(child: Expression) extends UnaryExpression with 
ImplicitCastInputTypes {
    +
    +  override def inputTypes: Seq[AbstractDataType] = Seq(TimestampType)
    +
    +  override def dataType: DataType = IntegerType
    +
    +  override protected def nullSafeEval(timestamp: Any): Any = {
    +    val time = timestamp.asInstanceOf[Long] / 1000
    +    val longTime: Long = time.asInstanceOf[Long] + 
TimeZone.getDefault.getOffset(time)
    +    ((longTime / (1000 * 3600)) % 24).toInt
    +  }
    +
    +  override def genCode(ctx: CodeGenContext, ev: GeneratedExpressionCode): 
String = {
    +    val tz = classOf[TimeZone].getName
    +    defineCodeGen(ctx, ev, (c) =>
    +      s"""(int) ((($c / 1000) + $tz.getDefault().getOffset($c / 1000))
    +                     / (1000 * 3600) % 24)""".stripMargin
    +    )
    +  }
    +}
    +
    +case class Minute(child: Expression) extends UnaryExpression with 
ImplicitCastInputTypes {
    +
    +  override def inputTypes: Seq[AbstractDataType] = Seq(TimestampType)
    +
    +  override def dataType: DataType = IntegerType
    +
    +  override protected def nullSafeEval(timestamp: Any): Any = {
    +    val time = timestamp.asInstanceOf[Long] / 1000
    +    val longTime: Long = time.asInstanceOf[Long] + 
TimeZone.getDefault.getOffset(time)
    +    ((longTime / (1000 * 60)) % 60).toInt
    +  }
    +
    +  override def genCode(ctx: CodeGenContext, ev: GeneratedExpressionCode): 
String = {
    +    val tz = classOf[TimeZone].getName
    +    defineCodeGen(ctx, ev, (c) =>
    +      s"""(int) ((($c / 1000) + $tz.getDefault().getOffset($c / 1000))
    +                     / (1000 * 60) % 60)""".stripMargin
    +    )
    +  }
    +}
    +
    +case class Second(child: Expression) extends UnaryExpression with 
ImplicitCastInputTypes {
    +
    +  override def inputTypes: Seq[AbstractDataType] = Seq(TimestampType)
    +
    +  override def dataType: DataType = IntegerType
    +
    +  override protected def nullSafeEval(time: Any): Any = {
    +    (time.asInstanceOf[Long] / 1000L / 1000L % 60L).toInt
    +  }
    +
    +  override protected def genCode(ctx: CodeGenContext, ev: 
GeneratedExpressionCode): String = {
    +    nullSafeCodeGen(ctx, ev, (time) => {
    +      s"""${ev.primitive} = (int) ($time / 1000L / 1000L % 60L);"""
    +    })
    +  }
    +}
    +
    +abstract class DateFormatExpression extends UnaryExpression with 
ImplicitCastInputTypes {
    +  self: Product =>
    +
    +  val daysIn400Years: Int = 146097
    +  val to2001 = -11323
    +
    +  // this is year -17999, calculation: 50 * daysIn400Year
    +  val toYearZero = to2001 + 7304850
    +
    +  protected def isLeapYear(year: Int): Boolean = {
    +    (year % 4) == 0 && ((year % 100) != 0 || (year % 400) == 0)
    +  }
    +
    +  private[this] def yearBoundary(year: Int): Int = {
    +    year * 365 + ((year / 4 ) - (year / 100) + (year / 400))
    +  }
    +
    +  private[this] def numYears(in: Int): Int = {
    +    val year = in / 365
    +    if (in > yearBoundary(year)) year else year - 1
    +  }
    +
    +  override def dataType: DataType = IntegerType
    +
    +  override def inputTypes: Seq[AbstractDataType] = Seq(DateType)
    +
    +  protected def calculateYearAndDayInYear(daysIn: Int): (Int, Int) = {
    +    val daysNormalized = daysIn + toYearZero
    +    val numOfQuarterCenturies = daysNormalized / daysIn400Years
    +    val daysInThis400 = daysNormalized % daysIn400Years + 1
    +    val years = numYears(daysInThis400)
    +    val year: Int = (2001 - 20000) + 400 * numOfQuarterCenturies + years
    +    val dayInYear = daysInThis400 - yearBoundary(years)
    +    (year, dayInYear)
    +  }
    +
    +  protected def codeGen(ctx: CodeGenContext, ev: GeneratedExpressionCode, 
input: String,
    +      f: (String, String) => String): String = {
    +    val daysIn400Years = ctx.freshName("daysIn400Years")
    +    val to2001 = ctx.freshName("to2001")
    --- End diff --
    
    can you define what to2001 is?


---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at [email protected] or file a JIRA ticket
with INFRA.
---

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to