use crate::{BoolExpr, ValueExpr};
use super::{function, literal};
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
#[non_exhaustive]
pub enum DatePart {
Microseconds,
Milliseconds,
Second,
Minute,
Hour,
Day,
Week,
Month,
Quarter,
Year,
Decade,
Century,
Millennium,
}
impl DatePart {
#[inline]
pub const fn as_sql(self) -> &'static str {
match self {
Self::Microseconds => "microseconds",
Self::Milliseconds => "milliseconds",
Self::Second => "second",
Self::Minute => "minute",
Self::Hour => "hour",
Self::Day => "day",
Self::Week => "week",
Self::Month => "month",
Self::Quarter => "quarter",
Self::Year => "year",
Self::Decade => "decade",
Self::Century => "century",
Self::Millennium => "millennium",
}
}
}
pub fn now() -> ValueExpr {
function("now", Vec::<ValueExpr>::new())
}
pub fn current_timestamp() -> ValueExpr {
ValueExpr::Keyword("CURRENT_TIMESTAMP")
}
pub fn current_date() -> ValueExpr {
ValueExpr::Keyword("CURRENT_DATE")
}
pub fn date_trunc(part: impl Into<ValueExpr>, expr: impl Into<ValueExpr>) -> ValueExpr {
function("date_trunc", [part.into(), expr.into()])
}
pub fn date_trunc_part(part: DatePart, expr: impl Into<ValueExpr>) -> ValueExpr {
date_trunc(literal(part.as_sql()), expr)
}
pub fn date_bin(
stride: impl Into<ValueExpr>,
source: impl Into<ValueExpr>,
origin: impl Into<ValueExpr>,
) -> ValueExpr {
function("date_bin", [stride.into(), source.into(), origin.into()])
}
pub fn to_char(value: impl Into<ValueExpr>, format: impl Into<ValueExpr>) -> ValueExpr {
function("to_char", [value.into(), format.into()])
}
pub fn to_date(text: impl Into<ValueExpr>, format: impl Into<ValueExpr>) -> ValueExpr {
function("to_date", [text.into(), format.into()])
}
pub fn to_timestamp(text: impl Into<ValueExpr>, format: impl Into<ValueExpr>) -> ValueExpr {
function("to_timestamp", [text.into(), format.into()])
}
pub fn to_number(text: impl Into<ValueExpr>, format: impl Into<ValueExpr>) -> ValueExpr {
function("to_number", [text.into(), format.into()])
}
pub fn isfinite(value: impl Into<ValueExpr>) -> BoolExpr {
function("isfinite", [value]).is_true()
}
pub fn extract(field: &'static str, expr: impl Into<ValueExpr>) -> ValueExpr {
ValueExpr::extract(field, expr.into())
}
pub fn age(args: impl IntoIterator<Item = impl Into<ValueExpr>>) -> ValueExpr {
function("age", args)
}
pub fn make_date(
year: impl Into<ValueExpr>,
month: impl Into<ValueExpr>,
day: impl Into<ValueExpr>,
) -> ValueExpr {
function("make_date", [year.into(), month.into(), day.into()])
}
pub fn make_time(
hour: impl Into<ValueExpr>,
min: impl Into<ValueExpr>,
sec: impl Into<ValueExpr>,
) -> ValueExpr {
function("make_time", [hour.into(), min.into(), sec.into()])
}
pub fn make_timestamp(args: impl IntoIterator<Item = impl Into<ValueExpr>>) -> ValueExpr {
function("make_timestamp", args)
}
pub fn make_timestamptz(args: impl IntoIterator<Item = impl Into<ValueExpr>>) -> ValueExpr {
function("make_timestamptz", args)
}
pub fn timezone(zone: impl Into<ValueExpr>, expr: impl Into<ValueExpr>) -> ValueExpr {
function("timezone", [zone.into(), expr.into()])
}