Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -214,22 +214,22 @@ public static Expression microsecond(DateTimeV2Literal date) {
*/
@ExecFunction(name = "dayofyear", argTypes = {"DATE"}, returnType = "SMALLINT")
public static Expression dayOfYear(DateLiteral date) {
return new SmallIntLiteral((short) date.toJavaDateType().getDayOfYear());
return new SmallIntLiteral((short) date.getDayOfYear());
}

@ExecFunction(name = "dayofyear", argTypes = {"DATETIME"}, returnType = "SMALLINT")
public static Expression dayOfYear(DateTimeLiteral date) {
return new SmallIntLiteral((short) date.toJavaDateType().getDayOfYear());
return new SmallIntLiteral((short) date.getDayOfYear());
}

@ExecFunction(name = "dayofyear", argTypes = {"DATEV2"}, returnType = "SMALLINT")
public static Expression dayOfYear(DateV2Literal date) {
return new SmallIntLiteral((short) date.toJavaDateType().getDayOfYear());
return new SmallIntLiteral((short) date.getDayOfYear());
}

@ExecFunction(name = "dayofyear", argTypes = {"DATETIMEV2"}, returnType = "SMALLINT")
public static Expression dayOfYear(DateTimeV2Literal date) {
return new SmallIntLiteral((short) date.toJavaDateType().getDayOfYear());
return new SmallIntLiteral((short) date.getDayOfYear());
}

/**
Expand Down Expand Up @@ -260,22 +260,22 @@ public static Expression dayOfMonth(DateTimeV2Literal date) {
*/
@ExecFunction(name = "dayofweek", argTypes = {"DATE"}, returnType = "TINYINT")
public static Expression dayOfWeek(DateLiteral date) {
return new TinyIntLiteral((byte) (date.toJavaDateType().getDayOfWeek().getValue() % 7 + 1));
return new TinyIntLiteral((byte) (date.getDayOfWeek() % 7 + 1));
}

@ExecFunction(name = "dayofweek", argTypes = {"DATETIME"}, returnType = "TINYINT")
public static Expression dayOfWeek(DateTimeLiteral date) {
return new TinyIntLiteral((byte) (date.toJavaDateType().getDayOfWeek().getValue() % 7 + 1));
return new TinyIntLiteral((byte) (date.getDayOfWeek() % 7 + 1));
}

@ExecFunction(name = "dayofweek", argTypes = {"DATEV2"}, returnType = "TINYINT")
public static Expression dayOfWeek(DateV2Literal date) {
return new TinyIntLiteral((byte) (date.toJavaDateType().getDayOfWeek().getValue() % 7 + 1));
return new TinyIntLiteral((byte) (date.getDayOfWeek() % 7 + 1));
}

@ExecFunction(name = "dayofweek", argTypes = {"DATETIMEV2"}, returnType = "TINYINT")
public static Expression dayOfWeek(DateTimeV2Literal date) {
return new TinyIntLiteral((byte) (date.toJavaDateType().getDayOfWeek().getValue() % 7 + 1));
return new TinyIntLiteral((byte) (date.getDayOfWeek() % 7 + 1));
}

private static int distanceToFirstDayOfWeek(LocalDateTime dateTime) {
Expand Down Expand Up @@ -853,18 +853,47 @@ public static Expression yearWeek(LocalDateTime localDateTime, int mode) {
}
}

/**
* weekofyear
*/
@ExecFunction(name = "weekofyear", argTypes = {"DATETIMEV2"}, returnType = "TINYINT")
public static Expression weekOfYear(DateTimeV2Literal dateTime) {
if (dateTime.getYear() == 0 && dateTime.getDayOfWeek() == 1) {
if (dateTime.getMonth() == 1 && dateTime.getDay() == 2) {
return new TinyIntLiteral((byte) 1);
}
return new TinyIntLiteral(
(byte) (dateTime.toJavaDateType().get(WeekFields.ISO.weekOfWeekBasedYear()) + 1));
}
return new TinyIntLiteral((byte) dateTime.toJavaDateType().get(WeekFields.ISO.weekOfWeekBasedYear()));
}

/**
* weekofyear
*/
@ExecFunction(name = "weekofyear", argTypes = {"DATETIME"}, returnType = "TINYINT")
public static Expression weekOfYear(DateTimeLiteral dateTime) {
if (dateTime.getYear() == 0 && dateTime.getDayOfWeek() == 1) {
if (dateTime.getMonth() == 1 && dateTime.getDay() == 2) {
return new TinyIntLiteral((byte) 1);
}
return new TinyIntLiteral(
(byte) (dateTime.toJavaDateType().get(WeekFields.ISO.weekOfWeekBasedYear()) + 1));
}
return new TinyIntLiteral((byte) dateTime.toJavaDateType().get(WeekFields.ISO.weekOfWeekBasedYear()));
}

/**
* weekofyear
*/
@ExecFunction(name = "weekofyear", argTypes = {"DATEV2"}, returnType = "TINYINT")
public static Expression weekOfYear(DateV2Literal date) {
if (date.getYear() == 0 && date.getDayOfWeek() == 1) {
if (date.getMonth() == 1 && date.getDay() == 2) {
return new TinyIntLiteral((byte) 1);
}
return new TinyIntLiteral((byte) (date.toJavaDateType().get(WeekFields.ISO.weekOfWeekBasedYear()) + 1));
}
return new TinyIntLiteral((byte) date.toJavaDateType().get(WeekFields.ISO.weekOfWeekBasedYear()));
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -417,6 +417,21 @@ public long getDay() {
return day;
}

public int getDayOfYear() {
if (year == 0 && month == 3 && (day == 1 || day == 2)) {
return toJavaDateType().getDayOfYear() - 1;
}
return toJavaDateType().getDayOfYear();
}

public int getDayOfWeek() {
if (year == 0 && (month == 1 || (month == 2 && day <= 28))) {
// shift right with 1 offset
return toJavaDateType().getDayOfWeek().getValue() % 7 + 1;
}
return toJavaDateType().getDayOfWeek().getValue();
}

public Expression plusDays(long days) {
return fromJavaDateType(toJavaDateType().plusDays(days));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@
package org.apache.doris.nereids.trees.expressions.functions;

import org.apache.doris.nereids.trees.expressions.functions.executable.DateTimeExtractAndTransform;
import org.apache.doris.nereids.trees.expressions.literal.DateTimeV2Literal;
import org.apache.doris.nereids.trees.expressions.literal.SmallIntLiteral;
import org.apache.doris.nereids.trees.expressions.literal.TinyIntLiteral;

import org.junit.jupiter.api.Assertions;
Expand Down Expand Up @@ -67,4 +69,59 @@ void testSpecialDateWeeks() {
Assertions.assertEquals(new TinyIntLiteral((byte) 1), DateTimeExtractAndTransform.yearWeek(time2, 6));
Assertions.assertEquals(new TinyIntLiteral((byte) 1), DateTimeExtractAndTransform.yearWeek(time2, 7));
}

@Test
void testSpecialDates() {
DateTimeV2Literal dt1 = new DateTimeV2Literal(0, 1, 1, 0, 0, 0);
DateTimeV2Literal dt2 = new DateTimeV2Literal(0, 1, 2, 0, 0, 0);
DateTimeV2Literal dt3 = new DateTimeV2Literal(0, 1, 3, 0, 0, 0);
DateTimeV2Literal dt4 = new DateTimeV2Literal(0, 1, 4, 0, 0, 0);
DateTimeV2Literal dt5 = new DateTimeV2Literal(0, 1, 5, 0, 0, 0);
DateTimeV2Literal dt6 = new DateTimeV2Literal(0, 1, 6, 0, 0, 0);
DateTimeV2Literal dt7 = new DateTimeV2Literal(0, 1, 7, 0, 0, 0);
DateTimeV2Literal dt8 = new DateTimeV2Literal(0, 1, 8, 0, 0, 0);
DateTimeV2Literal dtx1 = new DateTimeV2Literal(0, 2, 27, 0, 0, 0);
DateTimeV2Literal dtx2 = new DateTimeV2Literal(0, 2, 28, 0, 0, 0);
DateTimeV2Literal dtx3 = new DateTimeV2Literal(0, 3, 1, 0, 0, 0);
DateTimeV2Literal dtx4 = new DateTimeV2Literal(0, 3, 2, 0, 0, 0);

Assertions.assertEquals(new TinyIntLiteral((byte) 1), DateTimeExtractAndTransform.dayOfWeek(dt1));
Assertions.assertEquals(new TinyIntLiteral((byte) 2), DateTimeExtractAndTransform.dayOfWeek(dt2));
Assertions.assertEquals(new TinyIntLiteral((byte) 3), DateTimeExtractAndTransform.dayOfWeek(dt3));
Assertions.assertEquals(new TinyIntLiteral((byte) 4), DateTimeExtractAndTransform.dayOfWeek(dt4));
Assertions.assertEquals(new TinyIntLiteral((byte) 5), DateTimeExtractAndTransform.dayOfWeek(dt5));
Assertions.assertEquals(new TinyIntLiteral((byte) 6), DateTimeExtractAndTransform.dayOfWeek(dt6));
Assertions.assertEquals(new TinyIntLiteral((byte) 7), DateTimeExtractAndTransform.dayOfWeek(dt7));
Assertions.assertEquals(new TinyIntLiteral((byte) 1), DateTimeExtractAndTransform.dayOfWeek(dt8));
Assertions.assertEquals(new TinyIntLiteral((byte) 2), DateTimeExtractAndTransform.dayOfWeek(dtx1));
Assertions.assertEquals(new TinyIntLiteral((byte) 3), DateTimeExtractAndTransform.dayOfWeek(dtx2));
Assertions.assertEquals(new TinyIntLiteral((byte) 4), DateTimeExtractAndTransform.dayOfWeek(dtx3));
Assertions.assertEquals(new TinyIntLiteral((byte) 5), DateTimeExtractAndTransform.dayOfWeek(dtx4));

Assertions.assertEquals(new SmallIntLiteral((short) 1), DateTimeExtractAndTransform.dayOfYear(dt1));
Assertions.assertEquals(new SmallIntLiteral((short) 2), DateTimeExtractAndTransform.dayOfYear(dt2));
Assertions.assertEquals(new SmallIntLiteral((short) 3), DateTimeExtractAndTransform.dayOfYear(dt3));
Assertions.assertEquals(new SmallIntLiteral((short) 4), DateTimeExtractAndTransform.dayOfYear(dt4));
Assertions.assertEquals(new SmallIntLiteral((short) 5), DateTimeExtractAndTransform.dayOfYear(dt5));
Assertions.assertEquals(new SmallIntLiteral((short) 6), DateTimeExtractAndTransform.dayOfYear(dt6));
Assertions.assertEquals(new SmallIntLiteral((short) 7), DateTimeExtractAndTransform.dayOfYear(dt7));
Assertions.assertEquals(new SmallIntLiteral((short) 8), DateTimeExtractAndTransform.dayOfYear(dt8));
Assertions.assertEquals(new SmallIntLiteral((short) 58), DateTimeExtractAndTransform.dayOfYear(dtx1));
Assertions.assertEquals(new SmallIntLiteral((short) 59), DateTimeExtractAndTransform.dayOfYear(dtx2));
Assertions.assertEquals(new SmallIntLiteral((short) 60), DateTimeExtractAndTransform.dayOfYear(dtx3));
Assertions.assertEquals(new SmallIntLiteral((short) 61), DateTimeExtractAndTransform.dayOfYear(dtx4));

Assertions.assertEquals(new TinyIntLiteral((byte) 52), DateTimeExtractAndTransform.weekOfYear(dt1));
Assertions.assertEquals(new TinyIntLiteral((byte) 1), DateTimeExtractAndTransform.weekOfYear(dt2));
Assertions.assertEquals(new TinyIntLiteral((byte) 1), DateTimeExtractAndTransform.weekOfYear(dt3));
Assertions.assertEquals(new TinyIntLiteral((byte) 1), DateTimeExtractAndTransform.weekOfYear(dt4));
Assertions.assertEquals(new TinyIntLiteral((byte) 1), DateTimeExtractAndTransform.weekOfYear(dt5));
Assertions.assertEquals(new TinyIntLiteral((byte) 1), DateTimeExtractAndTransform.weekOfYear(dt6));
Assertions.assertEquals(new TinyIntLiteral((byte) 1), DateTimeExtractAndTransform.weekOfYear(dt7));
Assertions.assertEquals(new TinyIntLiteral((byte) 1), DateTimeExtractAndTransform.weekOfYear(dt8));
Assertions.assertEquals(new TinyIntLiteral((byte) 9), DateTimeExtractAndTransform.weekOfYear(dtx1));
Assertions.assertEquals(new TinyIntLiteral((byte) 9), DateTimeExtractAndTransform.weekOfYear(dtx2));
Assertions.assertEquals(new TinyIntLiteral((byte) 9), DateTimeExtractAndTransform.weekOfYear(dtx3));
Assertions.assertEquals(new TinyIntLiteral((byte) 9), DateTimeExtractAndTransform.weekOfYear(dtx4));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,5 +15,8 @@ true
2012-03-12

-- !sql6 --
\N
\N \N \N \N

-- !sql7 --
\N \N \N \N

Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,10 @@ suite("test_cast_date_decimal") {
"""

qt_sql6 """
select cast('0000-02-29' as date);
select cast('0000-02-29' as date), cast('0000-02-29' as datetime), cast('00000229' as date), cast('0000-02-29 12:12:12.123' as datetime);
"""

qt_sql7 """
select /*+SET_VAR(debug_skip_fold_constant=true)*/ cast('0000-02-29' as date), cast('0000-02-29' as datetime), cast('00000229' as date), cast('0000-02-29 12:12:12.123' as datetime);
"""
}