@@ -771,23 +771,45 @@ pub fn create_datediff_udf() -> ScalarUDF {
771771 assert ! ( args. len( ) == 3 ) ;
772772
773773 let datepart_array = downcast_string_arg ! ( args[ 0 ] , "datepart" , i32 ) ;
774- match ( & args[ 1 ] . data_type ( ) , & args[ 2 ] . data_type ( ) ) {
775- (
776- DataType :: Timestamp ( TimeUnit :: Nanosecond , None ) ,
777- DataType :: Timestamp ( TimeUnit :: Nanosecond , None ) ,
778- ) => ( ) ,
779- _ => {
774+
775+ let left_date_array = match args[ 1 ] . data_type ( ) {
776+ DataType :: Timestamp ( TimeUnit :: Nanosecond , None ) => Arc :: clone ( & args[ 1 ] ) ,
777+ DataType :: Timestamp ( TimeUnit :: Microsecond , None )
778+ | DataType :: Timestamp ( TimeUnit :: Millisecond , None )
779+ | DataType :: Timestamp ( TimeUnit :: Second , None ) => cast_with_options (
780+ & args[ 1 ] ,
781+ & DataType :: Timestamp ( TimeUnit :: Nanosecond , None ) ,
782+ & CastOptions { safe : false } ,
783+ ) ?,
784+ t => {
780785 return Err ( DataFusionError :: Execution ( format ! (
781- "date arguments must be of type TimestampNanosecond, actual: {}, {}" ,
782- & args[ 1 ] . data_type( ) ,
783- & args[ 2 ] . data_type( ) ,
784- ) ) ) ;
786+ "second datediff argument must be of type Timestamp actual: {}" ,
787+ t
788+ ) ) )
785789 }
786- }
790+ } ;
791+
792+ let right_date_array = match args[ 2 ] . data_type ( ) {
793+ DataType :: Timestamp ( TimeUnit :: Nanosecond , None ) => Arc :: clone ( & args[ 2 ] ) ,
794+ DataType :: Timestamp ( TimeUnit :: Microsecond , None )
795+ | DataType :: Timestamp ( TimeUnit :: Millisecond , None )
796+ | DataType :: Timestamp ( TimeUnit :: Second , None ) => cast_with_options (
797+ & args[ 2 ] ,
798+ & DataType :: Timestamp ( TimeUnit :: Nanosecond , None ) ,
799+ & CastOptions { safe : false } ,
800+ ) ?,
801+ t => {
802+ return Err ( DataFusionError :: Execution ( format ! (
803+ "third datediff argument must be of type Timestamp actual: {}" ,
804+ t
805+ ) ) )
806+ }
807+ } ;
808+
787809 let left_date_array =
788- downcast_primitive_arg ! ( args [ 1 ] , "left_date" , TimestampNanosecondType ) ;
810+ downcast_primitive_arg ! ( left_date_array , "left_date" , TimestampNanosecondType ) ;
789811 let right_date_array =
790- downcast_primitive_arg ! ( args [ 2 ] , "right_date" , TimestampNanosecondType ) ;
812+ downcast_primitive_arg ! ( right_date_array , "right_date" , TimestampNanosecondType ) ;
791813
792814 let result = izip ! ( datepart_array, left_date_array, right_date_array)
793815 . map ( |args| {
0 commit comments