Skip to content

Commit d11f8e4

Browse files
yaooqinnmeta-codesync[bot]
authored andcommitted
feat(function): Add Spark dayname function (facebookincubator#15957)
Summary: Implements the `dayname()` function for Spark SQL compatibility that returns the three-letter abbreviated day name (Sun, Mon, Tue, Wed, Thu, Fri, Sat) from a given date. Pull Request resolved: facebookincubator#15957 Reviewed By: xiaoxmeng Differential Revision: D90602088 Pulled By: kevinwilfong fbshipit-source-id: b3f41a4e05951d0b343fb4aba8857fd4a96ecde0
1 parent 6218c09 commit d11f8e4

File tree

4 files changed

+62
-0
lines changed

4 files changed

+62
-0
lines changed

velox/docs/functions/spark/datetime.rst

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,15 @@ These functions support TIMESTAMP and DATE input types.
106106
SELECT datediff('2009-07-31', '2009-07-30'); -- 1
107107
SELECT datediff('2009-07-30', '2009-07-31'); -- -1
108108

109+
.. spark:function:: dayname(date) -> varchar
110+
111+
Returns the three-letter abbreviated day name from the given date (Sun, Mon, Tue, Wed, Thu, Fri, Sat). ::
112+
113+
SELECT dayname('2009-07-30'); -- 'Thu'
114+
SELECT dayname('2023-08-20'); -- 'Sun'
115+
SELECT dayname('2023-08-21'); -- 'Mon'
116+
SELECT dayname('1582-10-15'); -- 'Fri'
117+
109118
.. spark:function:: dayofmonth(date) -> integer
110119
111120
Returns the day of month of the date. ::

velox/functions/sparksql/DateTimeFunctions.h

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -779,6 +779,40 @@ struct WeekdayFunction {
779779
}
780780
};
781781

782+
template <typename T>
783+
struct DayNameFunction {
784+
VELOX_DEFINE_FUNCTION_TYPES(T);
785+
786+
FOLLY_ALWAYS_INLINE void call(
787+
out_type<Varchar>& result,
788+
const arg_type<Date>& date) {
789+
const auto tm = getDateTime(date);
790+
switch (tm.tm_wday) {
791+
case 0:
792+
result.append("Sun");
793+
break;
794+
case 1:
795+
result.append("Mon");
796+
break;
797+
case 2:
798+
result.append("Tue");
799+
break;
800+
case 3:
801+
result.append("Wed");
802+
break;
803+
case 4:
804+
result.append("Thu");
805+
break;
806+
case 5:
807+
result.append("Fri");
808+
break;
809+
default:
810+
result.append("Sat");
811+
break;
812+
}
813+
}
814+
};
815+
782816
template <typename T>
783817
struct NextDayFunction {
784818
VELOX_DEFINE_FUNCTION_TYPES(T);

velox/functions/sparksql/registration/RegisterDatetime.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ void registerDatetimeFunctions(const std::string& prefix) {
6565
registerFunction<DateSubFunction, Date, Date, int32_t>({prefix + "date_sub"});
6666
registerFunction<DayFunction, int32_t, Date>(
6767
{prefix + "day", prefix + "dayofmonth"});
68+
registerFunction<DayNameFunction, Varchar, Date>({prefix + "dayname"});
6869
registerFunction<DayOfYearFunction, int32_t, Date>({prefix + "dayofyear"});
6970
registerFunction<DayOfWeekFunction, int32_t, Date>({prefix + "dayofweek"});
7071
registerFunction<WeekdayFunction, int32_t, Date>({prefix + "weekday"});

velox/functions/sparksql/tests/DateTimeFunctionsTest.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -658,6 +658,24 @@ TEST_F(DateTimeFunctionsTest, weekdayDate) {
658658
EXPECT_EQ(4, weekday(parseDate("1582-10-15")));
659659
}
660660

661+
TEST_F(DateTimeFunctionsTest, dayNameDate) {
662+
const auto dayName = [&](std::optional<int32_t> date) {
663+
return evaluateOnce<std::string>("dayname(c0)", DATE(), date);
664+
};
665+
666+
EXPECT_EQ(std::nullopt, dayName(std::nullopt));
667+
EXPECT_EQ("Thu", dayName(0)); // 1970-01-01
668+
EXPECT_EQ("Sun", dayName(parseDate("2023-08-20")));
669+
EXPECT_EQ("Mon", dayName(parseDate("2023-08-21")));
670+
EXPECT_EQ("Tue", dayName(parseDate("2023-08-22")));
671+
EXPECT_EQ("Wed", dayName(parseDate("2023-08-23")));
672+
EXPECT_EQ("Thu", dayName(parseDate("2023-08-24")));
673+
EXPECT_EQ("Fri", dayName(parseDate("2023-08-25")));
674+
EXPECT_EQ("Sat", dayName(parseDate("2023-08-26")));
675+
EXPECT_EQ(
676+
"Fri", dayName(parseDate("1582-10-15"))); // Gregorian calendar start.
677+
}
678+
661679
TEST_F(DateTimeFunctionsTest, dateDiffDate) {
662680
const auto dateDiff = [&](std::optional<int32_t> endDate,
663681
std::optional<int32_t> startDate) {

0 commit comments

Comments
 (0)