handle formatting issues

This commit is contained in:
Sachin Singh 2025-04-11 09:59:27 +05:30
parent 05b4b7b9f1
commit 23ab387143
2 changed files with 37 additions and 38 deletions

View file

@ -673,6 +673,7 @@ pub fn exec_timediff(values: &[Register]) -> OwnedValue {
}
}
/// Format the time duration as +/-YYYY-MM-DD HH:MM:SS.SSS as per SQLite's timediff() function
fn format_time_duration(duration: &chrono::Duration) -> OwnedValue {
let is_negative = duration.num_seconds() < 0;
@ -681,32 +682,31 @@ fn format_time_duration(duration: &chrono::Duration) -> OwnedValue {
} else {
duration.clone()
};
let total_seconds = abs_duration.num_seconds();
let hours = total_seconds / 3600;
let hours = (total_seconds % 86400) / 3600;
let minutes = (total_seconds % 3600) / 60;
let seconds = total_seconds % 60;
let days = total_seconds / 86400;
let years = days / 365;
let remaining_days = days % 365;
let months = 0;
let total_millis = abs_duration.num_milliseconds();
let millis = total_millis % 1000;
let result = if millis > 0 {
format!(
"{}{:02}:{:02}:{:02}.{:03}",
if is_negative { "-" } else { "" },
hours,
minutes,
seconds,
millis
)
} else {
format!(
"{}{:02}:{:02}:{:02}",
if is_negative { "-" } else { "" },
hours,
minutes,
seconds
)
};
let result = format!(
"{}{:04}-{:02}-{:02} {:02}:{:02}:{:02}.{:03}",
if is_negative { "-" } else { "+" },
years,
months,
remaining_days,
hours,
minutes,
seconds,
millis
);
OwnedValue::build_text(&result)
}
@ -1702,7 +1702,7 @@ mod tests {
fn test_exec_timediff() {
let start = OwnedValue::build_text("12:00:00");
let end = OwnedValue::build_text("14:30:45");
let expected = OwnedValue::build_text("-02:30:45");
let expected = OwnedValue::build_text("-0000-00-00 02:30:45.000");
assert_eq!(
exec_timediff(&[Register::OwnedValue(start), Register::OwnedValue(end)]),
expected
@ -1710,7 +1710,7 @@ mod tests {
let start = OwnedValue::build_text("14:30:45");
let end = OwnedValue::build_text("12:00:00");
let expected = OwnedValue::build_text("02:30:45");
let expected = OwnedValue::build_text("+0000-00-00 02:30:45.000");
assert_eq!(
exec_timediff(&[Register::OwnedValue(start), Register::OwnedValue(end)]),
expected
@ -1718,7 +1718,7 @@ mod tests {
let start = OwnedValue::build_text("12:00:01.300");
let end = OwnedValue::build_text("12:00:00.500");
let expected = OwnedValue::build_text("00:00:00.800");
let expected = OwnedValue::build_text("+0000-00-00 00:00:00.800");
assert_eq!(
exec_timediff(&[Register::OwnedValue(start), Register::OwnedValue(end)]),
expected
@ -1726,7 +1726,7 @@ mod tests {
let start = OwnedValue::build_text("13:30:00");
let end = OwnedValue::build_text("16:45:30");
let expected = OwnedValue::build_text("-03:15:30");
let expected = OwnedValue::build_text("-0000-00-00 03:15:30.000");
assert_eq!(
exec_timediff(&[Register::OwnedValue(start), Register::OwnedValue(end)]),
expected
@ -1734,7 +1734,7 @@ mod tests {
let start = OwnedValue::build_text("2023-05-10 23:30:00");
let end = OwnedValue::build_text("2023-05-11 01:15:00");
let expected = OwnedValue::build_text("-01:45:00");
let expected = OwnedValue::build_text("-0000-00-00 01:45:00.000");
assert_eq!(
exec_timediff(&[Register::OwnedValue(start), Register::OwnedValue(end)]),
expected