pg_interval/interval_fmt/
sql.rs

1use 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(&microseconds);
63    }
64    interval
65}