delamarch3 commented on code in PR #7189:
URL: https://github.com/apache/arrow-rs/pull/7189#discussion_r1974334220


##########
arrow-arith/src/temporal.rs:
##########
@@ -488,25 +492,31 @@ impl ExtractDatePartExt for 
PrimitiveArray<IntervalMonthDayNanoType> {
     fn date_part(&self, part: DatePart) -> Result<Int32Array, ArrowError> {
         match part {
             DatePart::Year => Ok(self.unary_opt(|d: IntervalMonthDayNano| 
Some(d.months / 12))),
-            DatePart::Month => Ok(self.unary_opt(|d: IntervalMonthDayNano| 
Some(d.months))),
+            DatePart::Month => Ok(self.unary_opt(|d: IntervalMonthDayNano| 
Some(d.months % 12))),

Review Comment:
   ```sql
   D SELECT datepart('year', interval '12 month');
   ┌────────────────────────────────────────────────┐
   │ datepart('year', CAST('12 month' AS INTERVAL)) │
   │                     int64                      │
   ├────────────────────────────────────────────────┤
   │                       1                        │
   └────────────────────────────────────────────────┘
   D SELECT datepart('month', interval '12 month');
   ┌─────────────────────────────────────────────────┐
   │ datepart('month', CAST('12 month' AS INTERVAL)) │
   │                      int64                      │
   ├─────────────────────────────────────────────────┤
   │                        0                        │
   └─────────────────────────────────────────────────┘
   ```



##########
arrow-arith/src/temporal.rs:
##########
@@ -464,11 +464,15 @@ impl ExtractDatePartExt for 
PrimitiveArray<IntervalDayTimeType> {
             DatePart::Week => Ok(self.unary_opt(|d| Some(d.days / 7))),
             DatePart::Day => Ok(self.unary_opt(|d| Some(d.days))),
             DatePart::Hour => Ok(self.unary_opt(|d| Some(d.milliseconds / (60 
* 60 * 1_000)))),
-            DatePart::Minute => Ok(self.unary_opt(|d| Some(d.milliseconds / 
(60 * 1_000)))),
-            DatePart::Second => Ok(self.unary_opt(|d| Some(d.milliseconds / 
1_000))),
-            DatePart::Millisecond => Ok(self.unary_opt(|d| 
Some(d.milliseconds))),
-            DatePart::Microsecond => Ok(self.unary_opt(|d| 
d.milliseconds.checked_mul(1_000))),
-            DatePart::Nanosecond => Ok(self.unary_opt(|d| 
d.milliseconds.checked_mul(1_000_000))),
+            DatePart::Minute => Ok(self.unary_opt(|d| Some(d.milliseconds / 
(60 * 1_000) % 60))),
+            DatePart::Second => Ok(self.unary_opt(|d| Some(d.milliseconds / 
1_000 % 60))),
+            DatePart::Millisecond => Ok(self.unary_opt(|d| Some(d.milliseconds 
% (60 * 1_000)))),
+            DatePart::Microsecond => {
+                Ok(self.unary_opt(|d| (d.milliseconds % (60 * 
1_000)).checked_mul(1_000)))
+            }
+            DatePart::Nanosecond => {
+                Ok(self.unary_opt(|d| (d.milliseconds % (60 * 
1_000)).checked_mul(1_000_000)))
+            }

Review Comment:
   ```sql
   D SELECT datepart('m', interval '1m 61s 33ms 44us');
   ┌─────────────────────────────────────────────────────┐
   │ datepart('m', CAST('1m 61s 33ms 44us' AS INTERVAL)) │
   │                        int64                        │
   ├─────────────────────────────────────────────────────┤
   │                          2                          │
   └─────────────────────────────────────────────────────┘
   D SELECT datepart('s', interval '1m 61s 33ms 44us');
   ┌─────────────────────────────────────────────────────┐
   │ datepart('s', CAST('1m 61s 33ms 44us' AS INTERVAL)) │
   │                        int64                        │
   ├─────────────────────────────────────────────────────┤
   │                          1                          │
   └─────────────────────────────────────────────────────┘
   D SELECT datepart('ms', interval '1m 61s 33ms 44us');
   ┌──────────────────────────────────────────────────────┐
   │ datepart('ms', CAST('1m 61s 33ms 44us' AS INTERVAL)) │
   │                        int64                         │
   ├──────────────────────────────────────────────────────┤
   │                         1033                         │
   └──────────────────────────────────────────────────────┘
   D SELECT datepart('us', interval '1m 61s 33ms 44us');
   ┌──────────────────────────────────────────────────────┐
   │ datepart('us', CAST('1m 61s 33ms 44us' AS INTERVAL)) │
   │                        int64                         │
   ├──────────────────────────────────────────────────────┤
   │                       1033044                        │
   │                    (1.03 million)                    │
   └──────────────────────────────────────────────────────┘
   ```



##########
arrow-arith/src/temporal.rs:
##########
@@ -464,11 +464,15 @@ impl ExtractDatePartExt for 
PrimitiveArray<IntervalDayTimeType> {
             DatePart::Week => Ok(self.unary_opt(|d| Some(d.days / 7))),
             DatePart::Day => Ok(self.unary_opt(|d| Some(d.days))),
             DatePart::Hour => Ok(self.unary_opt(|d| Some(d.milliseconds / (60 
* 60 * 1_000)))),

Review Comment:
   ```sql
   D SELECT datepart('hour', interval '25 hour');
   ┌───────────────────────────────────────────────┐
   │ datepart('hour', CAST('25 hour' AS INTERVAL)) │
   │                     int64                     │
   ├───────────────────────────────────────────────┤
   │                      25                       │
   └───────────────────────────────────────────────┘
   D SELECT datepart('day', interval '25 hour');
   ┌──────────────────────────────────────────────┐
   │ datepart('day', CAST('25 hour' AS INTERVAL)) │
   │                    int64                     │
   ├──────────────────────────────────────────────┤
   │                      0                       │
   └──────────────────────────────────────────────┘
   ```



-- 
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: github-unsubscr...@arrow.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org

Reply via email to