5#include "../SqlColumnTypeDefinitions.hpp"
16 SQL_DATE_STRUCT sqlValue {};
18 constexpr SqlDate()
noexcept =
default;
23 constexpr ~SqlDate()
noexcept =
default;
26 [[nodiscard]] LIGHTWEIGHT_FORCE_INLINE
constexpr std::chrono::year_month_day
value() const noexcept
28 return ConvertToNative(sqlValue);
31 LIGHTWEIGHT_FORCE_INLINE
constexpr bool operator==(
SqlDate const& other)
const noexcept
33 return sqlValue.year == other.sqlValue.year && sqlValue.month == other.sqlValue.month
34 && sqlValue.day == other.sqlValue.day;
37 LIGHTWEIGHT_FORCE_INLINE
constexpr bool operator!=(
SqlDate const& other)
const noexcept
39 return !(*
this == other);
44 sqlValue { SqlDate::ConvertToSqlValue(
value) }
49 constexpr SqlDate(std::chrono::year year, std::chrono::month month, std::chrono::day day)
noexcept:
50 SqlDate(std::chrono::year_month_day { year, month, day })
55 [[nodiscard]]
static LIGHTWEIGHT_FORCE_INLINE
SqlDate Today() noexcept
57 return SqlDate { std::chrono::year_month_day {
58 std::chrono::floor<std::chrono::days>(std::chrono::system_clock::now()),
62 static LIGHTWEIGHT_FORCE_INLINE
constexpr SQL_DATE_STRUCT ConvertToSqlValue(std::chrono::year_month_day
value)
noexcept
64 return SQL_DATE_STRUCT {
65 .year = (SQLSMALLINT) (
int)
value.year(),
66 .month = (SQLUSMALLINT) (
unsigned)
value.month(),
67 .day = (SQLUSMALLINT) (
unsigned)
value.day(),
71 static LIGHTWEIGHT_FORCE_INLINE
constexpr std::chrono::year_month_day ConvertToNative(
72 SQL_DATE_STRUCT
const&
value)
noexcept
74 return std::chrono::year_month_day { std::chrono::year {
value.year },
75 std::chrono::month {
static_cast<unsigned>(
value.month) },
76 std::chrono::day {
static_cast<unsigned>(
value.day) } };
81struct std::formatter<
SqlDate>: std::formatter<std::string>
83 auto format(
SqlDate const& value, std::format_context& ctx)
const -> std::format_context::iterator
85 return std::formatter<std::string>::format(
86 std::format(
"{:04}-{:02}-{:02}", value.sqlValue.year, value.sqlValue.month, value.sqlValue.day), ctx);
93 static constexpr auto ColumnType = SqlColumnTypeDefinitions::Date {};
95 static LIGHTWEIGHT_FORCE_INLINE SQLRETURN InputParameter(SQLHSTMT stmt,
100 return SQLBindParameter(
101 stmt, column, SQL_PARAM_INPUT, SQL_C_TYPE_DATE, SQL_TYPE_DATE, 0, 0, (SQLPOINTER) &value.sqlValue, 0,
nullptr);
104 static LIGHTWEIGHT_FORCE_INLINE SQLRETURN OutputColumn(
107 return SQLBindCol(stmt, column, SQL_C_TYPE_DATE, &result->sqlValue,
sizeof(result->sqlValue), indicator);
110 static LIGHTWEIGHT_FORCE_INLINE SQLRETURN GetColumn(
113 return SQLGetData(stmt, column, SQL_C_TYPE_DATE, &result->sqlValue,
sizeof(result->sqlValue), indicator);
116 static LIGHTWEIGHT_FORCE_INLINE std::string Inspect(
SqlDate const& value)
noexcept
118 return std::format(
"{}", value);
constexpr SqlDate(std::chrono::year year, std::chrono::month month, std::chrono::day day) noexcept
Constructs a date from individual components.
LIGHTWEIGHT_FORCE_INLINE constexpr std::chrono::year_month_day value() const noexcept
Returns the current date.
static LIGHTWEIGHT_FORCE_INLINE SqlDate Today() noexcept
Returns the current date.
constexpr SqlDate(std::chrono::year_month_day value) noexcept
Constructs a date from individual std::chrono::year_month_day.