@@ -177,6 +177,52 @@ impl EvalYearsImpl {
177177 }
178178}
179179
180+ pub struct EvalISOYearsImpl ;
181+ impl EvalISOYearsImpl {
182+ pub fn eval_date_diff ( date_start : i32 , date_end : i32 , tz : TimeZone ) -> i32 {
183+ let date_start = date_start. to_date ( tz. clone ( ) ) ;
184+ let date_end = date_end. to_date ( tz) ;
185+ date_end. iso_week_date ( ) . year ( ) as i32 - date_start. iso_week_date ( ) . year ( ) as i32
186+ }
187+
188+ pub fn eval_timestamp_diff ( date_start : i64 , date_end : i64 , tz : TimeZone ) -> i64 {
189+ let date_start = date_start. to_timestamp ( tz. clone ( ) ) ;
190+ let date_end = date_end. to_timestamp ( tz) ;
191+ date_end. date ( ) . iso_week_date ( ) . year ( ) as i64 - date_start. iso_week_date ( ) . year ( ) as i64
192+ }
193+ }
194+
195+ pub struct EvalYearWeeksImpl ;
196+ impl EvalYearWeeksImpl {
197+ pub fn eval_date_diff ( date_start : i32 , date_end : i32 , tz : TimeZone ) -> i32 {
198+ let date_start = date_start. to_date ( tz. clone ( ) ) ;
199+ let date_end = date_end. to_date ( tz) ;
200+ let week_date = date_end. iso_week_date ( ) ;
201+ let year = week_date. year ( ) as i32 * 100 ;
202+ let end = year + date_end. iso_week_date ( ) . week ( ) as i32 ;
203+
204+ let week_date = date_start. iso_week_date ( ) ;
205+ let year = week_date. year ( ) as i32 * 100 ;
206+ let start = year + date_start. iso_week_date ( ) . week ( ) as i32 ;
207+
208+ end - start
209+ }
210+
211+ pub fn eval_timestamp_diff ( date_start : i64 , date_end : i64 , tz : TimeZone ) -> i64 {
212+ let date_start = date_start. to_timestamp ( tz. clone ( ) ) ;
213+ let date_end = date_end. to_timestamp ( tz) ;
214+ let week_date = date_end. date ( ) . iso_week_date ( ) ;
215+ let year = week_date. year ( ) as i64 * 100 ;
216+ let end = year + date_end. date ( ) . iso_week_date ( ) . week ( ) as i64 ;
217+
218+ let week_date = date_start. date ( ) . iso_week_date ( ) ;
219+ let year = week_date. year ( ) as i64 * 100 ;
220+ let start = year + date_start. date ( ) . iso_week_date ( ) . week ( ) as i64 ;
221+
222+ end - start
223+ }
224+ }
225+
180226pub struct EvalQuartersImpl ;
181227
182228impl EvalQuartersImpl {
@@ -351,16 +397,21 @@ impl ToNumberImpl {
351397}
352398
353399pub struct ToYYYYMM ;
400+ pub struct ToYYYYWW ;
354401pub struct ToYYYYMMDD ;
355402pub struct ToYYYYMMDDHH ;
356403pub struct ToYYYYMMDDHHMMSS ;
357404pub struct ToYear ;
405+ pub struct ToTimezoneHour ;
406+ pub struct ToTimezoneMinute ;
407+ pub struct ToMillennium ;
358408pub struct ToISOYear ;
359409pub struct ToQuarter ;
360410pub struct ToMonth ;
361411pub struct ToDayOfYear ;
362412pub struct ToDayOfMonth ;
363413pub struct ToDayOfWeek ;
414+ pub struct DayOfWeek ;
364415pub struct ToHour ;
365416pub struct ToMinute ;
366417pub struct ToSecond ;
@@ -374,6 +425,12 @@ impl ToNumber<u32> for ToYYYYMM {
374425 }
375426}
376427
428+ impl ToNumber < u16 > for ToMillennium {
429+ fn to_number ( dt : & Zoned ) -> u16 {
430+ dt. year ( ) as u16 / 1000 + 1
431+ }
432+ }
433+
377434impl ToNumber < u32 > for ToWeekOfYear {
378435 fn to_number ( dt : & Zoned ) -> u32 {
379436 dt. date ( ) . iso_week_date ( ) . week ( ) as u32
@@ -412,12 +469,32 @@ impl ToNumber<u16> for ToYear {
412469 }
413470}
414471
472+ impl ToNumber < i16 > for ToTimezoneHour {
473+ fn to_number ( dt : & Zoned ) -> i16 {
474+ dt. offset ( ) . seconds ( ) . div_ceil ( 3600 ) as i16
475+ }
476+ }
477+
478+ impl ToNumber < i16 > for ToTimezoneMinute {
479+ fn to_number ( dt : & Zoned ) -> i16 {
480+ ( dt. offset ( ) . seconds ( ) % 3600 ) . div_ceil ( 60 ) as i16
481+ }
482+ }
483+
415484impl ToNumber < u16 > for ToISOYear {
416485 fn to_number ( dt : & Zoned ) -> u16 {
417486 dt. date ( ) . iso_week_date ( ) . year ( ) as _
418487 }
419488}
420489
490+ impl ToNumber < u32 > for ToYYYYWW {
491+ fn to_number ( dt : & Zoned ) -> u32 {
492+ let week_date = dt. date ( ) . iso_week_date ( ) ;
493+ let year = week_date. year ( ) as u32 * 100 ;
494+ year + dt. date ( ) . iso_week_date ( ) . week ( ) as u32
495+ }
496+ }
497+
421498impl ToNumber < u8 > for ToQuarter {
422499 fn to_number ( dt : & Zoned ) -> u8 {
423500 // begin with 0
@@ -449,6 +526,12 @@ impl ToNumber<u8> for ToDayOfWeek {
449526 }
450527}
451528
529+ impl ToNumber < u8 > for DayOfWeek {
530+ fn to_number ( dt : & Zoned ) -> u8 {
531+ dt. weekday ( ) . to_sunday_zero_offset ( ) as u8
532+ }
533+ }
534+
452535impl ToNumber < i64 > for ToUnixTimestamp {
453536 fn to_number ( dt : & Zoned ) -> i64 {
454537 dt. with_time_zone ( TimeZone :: UTC ) . timestamp ( ) . as_second ( )
0 commit comments