pg_interval/interval_fmt/
sql.rs1use crate::interval_norm::IntervalNorm;
2
3impl IntervalNorm {
4 pub fn into_sql(self) -> String {
5 if self.is_zeroed() {
6 "0".to_owned()
7 } else if !self.is_time_present() && !self.is_day_present() {
8 get_year_month(self.months, self.years, true)
9 } else if !self.is_time_present() && !self.is_year_month_present() {
10 format!("{} 0:00:00", self.days)
11 } else if !self.is_year_month_present() && !self.is_day_present() {
12 get_time_interval(
13 self.hours,
14 self.minutes,
15 self.seconds,
16 self.microseconds,
17 self.is_time_interval_pos(),
18 true,
19 )
20 } else {
21 let year_month = get_year_month(self.months, self.years, false);
22 let time_interval = get_time_interval(
23 self.hours,
24 self.minutes,
25 self.seconds,
26 self.microseconds,
27 self.is_time_interval_pos(),
28 false,
29 );
30 format!("{} {:+} {}", year_month, self.days, time_interval)
31 }
32 }
33}
34
35fn get_year_month(mons: i32, years: i32, is_only_year_month: bool) -> String {
36 let months = super::safe_abs_u32(mons);
37 if years == 0 || is_only_year_month {
38 format!("{}-{}", years, months)
39 } else {
40 format!("{:+}-{}", years, months)
41 }
42}
43
44fn get_time_interval(
45 hours: i64,
46 mins: i64,
47 secs: i64,
48 micros: i64,
49 is_time_interval_pos: bool,
50 is_only_time: bool,
51) -> String {
52 let mut interval = "".to_owned();
53 if is_time_interval_pos && is_only_time {
54 interval.push_str(&format!("{}:{:02}:{:02}", hours, mins, secs));
55 } else {
56 let minutes = super::safe_abs_u64(mins);
57 let seconds = super::safe_abs_u64(secs);
58 interval.push_str(&format!("{:+}:{:02}:{:02}", hours, minutes, seconds));
59 }
60 if micros != 0 {
61 let microseconds = format!(".{:06}", super::safe_abs_u64(micros));
62 interval.push_str(µseconds);
63 }
64 interval
65}