MaxGekk commented on a change in pull request #35502:
URL: https://github.com/apache/spark/pull/35502#discussion_r810638665
##########
File path:
sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/util/DateTimeUtils.scala
##########
@@ -1163,4 +1163,40 @@ object DateTimeUtils {
val localStartTs = getLocalDateTime(startMicros, zoneId)
ChronoUnit.MICROS.between(localStartTs, localEndTs)
}
+
+ /**
+ * Adds the specified number of units to a timestamp.
+ *
+ * @param unit A keyword that specifies the interval units to add to the
input timestamp.
+ * @param quantity The amount of `unit`s to add. It can be positive or
negative.
+ * @param micros The input timestamp value, expressed in microseconds since
1970-01-01 00:00:00Z.
+ * @param zoneId The time zone ID at which the operation is performed.
+ * @return A timestamp value, expressed in microseconds since 1970-01-01
00:00:00Z.
+ */
+ def timestampAdd(unit: String, quantity: Int, micros: Long, zoneId: ZoneId):
Long = {
+ unit.toUpperCase(Locale.ROOT) match {
+ case "MICROSECOND" =>
+ timestampAddDayTime(micros, quantity, zoneId)
+ case "MILLISECOND" =>
+ timestampAddDayTime(micros, quantity * MICROS_PER_MILLIS, zoneId)
+ case "SECOND" =>
+ timestampAddDayTime(micros, quantity * MICROS_PER_SECOND, zoneId)
+ case "MINUTE" =>
+ timestampAddDayTime(micros, quantity * MICROS_PER_MINUTE, zoneId)
+ case "HOUR" =>
+ timestampAddDayTime(micros, quantity * MICROS_PER_HOUR, zoneId)
+ case "DAY" | "DAYOFYEAR" =>
+ timestampAddDayTime(micros, quantity * MICROS_PER_DAY, zoneId)
+ case "WEEK" =>
+ timestampAddDayTime(micros, quantity * MICROS_PER_DAY * DAYS_PER_WEEK,
zoneId)
+ case "MONTH" =>
+ timestampAddMonths(micros, quantity, zoneId)
+ case "QUARTER" =>
+ timestampAddMonths(micros, quantity * 3, zoneId)
+ case "YEAR" =>
+ timestampAddMonths(micros, quantity * MONTHS_PER_YEAR, zoneId)
+ case _ =>
+ throw QueryExecutionErrors.invalidUnitInTimestampAdd(unit)
Review comment:
> the first argument, unit, should be a datetime **interval type**
I didn't get your point. How it could be the interval type?
> ... as in what's used with EXTRACT
Just wonder why do you linked `TIMESTAMPADD` to `EXTRACT` but not to
`TIMESTAMPDIFF`, for example. Anyway technically specking the type of the
first argument is the same - string type.
> ... makes things any simpler.
This PR achieve this goal, I believe. It makes the migration process to
Spark SQL simpler, and gives additional benefits of using Spark SQL in the real
production (see my comment above).
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]