relx 0.1.0
A Modern C++23 Type-Safe SQL Query Builder
Loading...
Searching...
No Matches
date.hpp
Go to the documentation of this file.
1#pragma once
2
3#include "../schema/column.hpp"
4#include "arithmetic.hpp"
6#include "condition.hpp"
7#include "core.hpp"
8#include "date_concepts.hpp"
9#include "function.hpp"
10#include "value.hpp"
11
12#include <chrono>
13#include <concepts>
14#include <memory>
15#include <optional>
16#include <string>
17#include <vector>
18
19namespace relx::query {
20
22template <SqlExpr Left, SqlExpr Right>
24public:
25 BinaryDateFunctionExpr(std::string func_name, std::string unit, Left left, Right right)
26 : func_name_(std::move(func_name)), unit_(std::move(unit)), left_(std::move(left)),
27 right_(std::move(right)) {}
28
29 std::string to_sql() const override {
30 // Generate PostgreSQL-compatible SQL for date differences
31 if (func_name_ == "DATE_DIFF") {
32 if (unit_ == "year") {
33 return "EXTRACT(YEAR FROM AGE(" + right_.to_sql() + ", " + left_.to_sql() + "))";
34 } else if (unit_ == "day") {
35 // For PostgreSQL, handle date vs timestamp arithmetic properly
36 // If we're dealing with timestamps, convert to date difference in days
37 // If we're dealing with dates, simple subtraction works
38 return "(" + right_.to_sql() + "::date - " + left_.to_sql() + "::date)";
39 } else if (unit_ == "second") {
40 return "EXTRACT(EPOCH FROM (" + right_.to_sql() + " - " + left_.to_sql() + "))";
41 } else if (unit_ == "month") {
42 return "EXTRACT(MONTH FROM AGE(" + right_.to_sql() + ", " + left_.to_sql() + "))";
43 } else if (unit_ == "hour") {
44 return "EXTRACT(EPOCH FROM (" + right_.to_sql() + " - " + left_.to_sql() + "))/3600";
45 } else if (unit_ == "minute") {
46 return "EXTRACT(EPOCH FROM (" + right_.to_sql() + " - " + left_.to_sql() + "))/60";
47 }
48 }
49 // Fallback to generic format for other functions
50 return func_name_ + "('" + unit_ + "', " + left_.to_sql() + ", " + right_.to_sql() + ")";
51 }
52
53 std::vector<std::string> bind_params() const override {
54 auto left_params = left_.bind_params();
55 auto right_params = right_.bind_params();
56 left_params.insert(left_params.end(), right_params.begin(), right_params.end());
57 return left_params;
58 }
59
60 std::string column_name() const override { return func_name_ + "_" + unit_; }
61
62 std::string table_name() const override {
63 if constexpr (std::is_base_of_v<ColumnExpression, Left>) {
64 auto table = left_.table_name();
65 if (!table.empty()) {
66 return table;
67 }
68 }
69 if constexpr (std::is_base_of_v<ColumnExpression, Right>) {
70 return right_.table_name();
71 }
72 return "";
73 }
74
75 // Operator overloads for comparisons with literals
76 template <typename LiteralT>
77 requires std::is_arithmetic_v<std::remove_cvref_t<LiteralT>> ||
78 std::is_convertible_v<std::remove_cvref_t<LiteralT>, std::string>
79 auto operator==(LiteralT&& literal) const {
80 auto val_expr = val(std::forward<LiteralT>(literal));
82 }
83
84 template <typename LiteralT>
85 requires std::is_arithmetic_v<std::remove_cvref_t<LiteralT>> ||
86 std::is_convertible_v<std::remove_cvref_t<LiteralT>, std::string>
87 auto operator!=(LiteralT&& literal) const {
88 auto val_expr = val(std::forward<LiteralT>(literal));
90 }
91
92 template <typename LiteralT>
93 requires std::is_arithmetic_v<std::remove_cvref_t<LiteralT>> ||
94 std::is_convertible_v<std::remove_cvref_t<LiteralT>, std::string>
95 auto operator>(LiteralT&& literal) const {
96 auto val_expr = val(std::forward<LiteralT>(literal));
98 }
99
100 template <typename LiteralT>
101 requires std::is_arithmetic_v<std::remove_cvref_t<LiteralT>> ||
102 std::is_convertible_v<std::remove_cvref_t<LiteralT>, std::string>
103 auto operator<(LiteralT&& literal) const {
104 auto val_expr = val(std::forward<LiteralT>(literal));
106 }
107
108 template <typename LiteralT>
109 requires std::is_arithmetic_v<std::remove_cvref_t<LiteralT>> ||
110 std::is_convertible_v<std::remove_cvref_t<LiteralT>, std::string>
111 auto operator>=(LiteralT&& literal) const {
112 auto val_expr = val(std::forward<LiteralT>(literal));
114 }
115
116 template <typename LiteralT>
117 requires std::is_arithmetic_v<std::remove_cvref_t<LiteralT>> ||
118 std::is_convertible_v<std::remove_cvref_t<LiteralT>, std::string>
119 auto operator<=(LiteralT&& literal) const {
120 auto val_expr = val(std::forward<LiteralT>(literal));
122 }
123
124 // Arithmetic operator overloads
125 template <typename NumericT>
126 requires std::is_arithmetic_v<std::remove_cvref_t<NumericT>>
127 auto operator*(NumericT&& literal) const {
128 auto val_expr = val(std::forward<NumericT>(literal));
130 }
131
132 template <typename NumericT>
133 requires std::is_arithmetic_v<std::remove_cvref_t<NumericT>>
134 auto operator+(NumericT&& literal) const {
135 auto val_expr = val(std::forward<NumericT>(literal));
137 }
138
139 template <typename NumericT>
140 requires std::is_arithmetic_v<std::remove_cvref_t<NumericT>>
141 auto operator-(NumericT&& literal) const {
142 auto val_expr = val(std::forward<NumericT>(literal));
144 }
145
146 template <typename NumericT>
147 requires std::is_arithmetic_v<std::remove_cvref_t<NumericT>>
148 auto operator/(NumericT&& literal) const {
149 auto val_expr = val(std::forward<NumericT>(literal));
151 }
152
153private:
154 std::string func_name_;
155 std::string unit_;
156 Left left_;
157 Right right_;
158};
159
161template <SqlExpr Expr>
163public:
164 UnaryDateFunctionExpr(std::string func_name, std::string unit, Expr expr)
165 : func_name_(std::move(func_name)), unit_(std::move(unit)), expr_(std::move(expr)) {}
166
167 std::string to_sql() const override {
168 if (func_name_ == "EXTRACT") {
169 return "EXTRACT(" + unit_ + " FROM " + expr_.to_sql() + ")";
170 }
171 if (func_name_ == "ABS") {
172 return "ABS(" + expr_.to_sql() + ")";
173 }
174 return func_name_ + "('" + unit_ + "', " + expr_.to_sql() + ")";
175 }
176
177 std::vector<std::string> bind_params() const override { return expr_.bind_params(); }
178
179 std::string column_name() const override { return func_name_ + "_" + unit_; }
180
181 std::string table_name() const override {
182 if constexpr (std::is_base_of_v<ColumnExpression, Expr>) {
183 return expr_.table_name();
184 }
185 return "";
186 }
187
188 // Operator overloads for comparisons with literals
189 template <typename LiteralT>
190 requires std::is_arithmetic_v<std::remove_cvref_t<LiteralT>> ||
191 std::is_convertible_v<std::remove_cvref_t<LiteralT>, std::string>
192 auto operator==(LiteralT&& literal) const {
193 auto val_expr = val(std::forward<LiteralT>(literal));
195 }
196
197 template <typename LiteralT>
198 requires std::is_arithmetic_v<std::remove_cvref_t<LiteralT>> ||
199 std::is_convertible_v<std::remove_cvref_t<LiteralT>, std::string>
200 auto operator!=(LiteralT&& literal) const {
201 auto val_expr = val(std::forward<LiteralT>(literal));
203 }
204
205 template <typename LiteralT>
206 requires std::is_arithmetic_v<std::remove_cvref_t<LiteralT>> ||
207 std::is_convertible_v<std::remove_cvref_t<LiteralT>, std::string>
208 auto operator>(LiteralT&& literal) const {
209 auto val_expr = val(std::forward<LiteralT>(literal));
211 }
212
213 template <typename LiteralT>
214 requires std::is_arithmetic_v<std::remove_cvref_t<LiteralT>> ||
215 std::is_convertible_v<std::remove_cvref_t<LiteralT>, std::string>
216 auto operator<(LiteralT&& literal) const {
217 auto val_expr = val(std::forward<LiteralT>(literal));
219 }
220
221 template <typename LiteralT>
222 requires std::is_arithmetic_v<std::remove_cvref_t<LiteralT>> ||
223 std::is_convertible_v<std::remove_cvref_t<LiteralT>, std::string>
224 auto operator>=(LiteralT&& literal) const {
225 auto val_expr = val(std::forward<LiteralT>(literal));
227 }
228
229 template <typename LiteralT>
230 requires std::is_arithmetic_v<std::remove_cvref_t<LiteralT>> ||
231 std::is_convertible_v<std::remove_cvref_t<LiteralT>, std::string>
232 auto operator<=(LiteralT&& literal) const {
233 auto val_expr = val(std::forward<LiteralT>(literal));
235 }
236
237 // Arithmetic operator overloads
238 template <typename NumericT>
239 requires std::is_arithmetic_v<std::remove_cvref_t<NumericT>>
240 auto operator*(NumericT&& literal) const {
241 auto val_expr = val(std::forward<NumericT>(literal));
243 }
244
245 template <typename NumericT>
246 requires std::is_arithmetic_v<std::remove_cvref_t<NumericT>>
247 auto operator+(NumericT&& literal) const {
248 auto val_expr = val(std::forward<NumericT>(literal));
250 }
251
252 template <typename NumericT>
253 requires std::is_arithmetic_v<std::remove_cvref_t<NumericT>>
254 auto operator-(NumericT&& literal) const {
255 auto val_expr = val(std::forward<NumericT>(literal));
257 }
258
259 template <typename NumericT>
260 requires std::is_arithmetic_v<std::remove_cvref_t<NumericT>>
261 auto operator/(NumericT&& literal) const {
262 auto val_expr = val(std::forward<NumericT>(literal));
264 }
265
266private:
267 std::string func_name_;
268 std::string unit_;
269 Expr expr_;
270};
271
274public:
275 explicit IntervalExpr(std::string interval) : interval_(std::move(interval)) {}
276
277 std::string to_sql() const override { return "INTERVAL '" + interval_ + "'"; }
278
279 std::vector<std::string> bind_params() const override { return {}; }
280
281 std::string column_name() const override { return "INTERVAL"; }
282
283 std::string table_name() const override { return ""; }
284
285private:
286 std::string interval_;
287};
288
290template <SqlExpr DateExpr, SqlExpr IntervalExpr>
292public:
293 DateArithmeticExpr(DateExpr date_expr, std::string op, IntervalExpr interval_expr)
294 : date_expr_(std::move(date_expr)), op_(std::move(op)),
295 interval_expr_(std::move(interval_expr)) {}
296
297 std::string to_sql() const override {
298 return "(" + date_expr_.to_sql() + " " + op_ + " " + interval_expr_.to_sql() + ")";
299 }
300
301 std::vector<std::string> bind_params() const override {
302 auto date_params = date_expr_.bind_params();
303 auto interval_params = interval_expr_.bind_params();
304 date_params.insert(date_params.end(), interval_params.begin(), interval_params.end());
305 return date_params;
306 }
307
308 std::string column_name() const override {
309 std::string date_name = "expr";
310 if constexpr (std::is_base_of_v<ColumnExpression, DateExpr>) {
311 date_name = date_expr_.column_name();
312 }
313 return "(" + date_name + "_" + op_ + "_INTERVAL)";
314 }
315
316 std::string table_name() const override {
317 if constexpr (std::is_base_of_v<ColumnExpression, DateExpr>) {
318 return date_expr_.table_name();
319 }
320 return "";
321 }
322
323private:
324 DateExpr date_expr_;
325 std::string op_;
326 IntervalExpr interval_expr_;
327};
328
331public:
332 explicit CurrentDateTimeExpr(std::string func_name) : func_name_(std::move(func_name)) {}
333
334 std::string to_sql() const override { return func_name_; }
335
336 std::vector<std::string> bind_params() const override { return {}; }
337
338 std::string column_name() const override { return func_name_; }
339
340 std::string table_name() const override { return ""; }
341
342 // Comparison operators with date columns
343 template <typename T>
345 auto operator>(const T& column) const {
347 to_expr(column));
348 }
349
350 template <typename T>
352 auto operator<(const T& column) const {
354 to_expr(column));
355 }
356
357 template <typename T>
359 auto operator>=(const T& column) const {
361 ">=", to_expr(column));
362 }
363
364 template <typename T>
366 auto operator<=(const T& column) const {
368 "<=", to_expr(column));
369 }
370
371 template <typename T>
373 auto operator==(const T& column) const {
375 to_expr(column));
376 }
377
378 template <typename T>
380 auto operator!=(const T& column) const {
382 "!=", to_expr(column));
383 }
384
385 // Comparison operators with other date expressions
386 template <SqlExpr Expr>
387 auto operator>(Expr expr) const {
388 return BinaryCondition<CurrentDateTimeExpr, Expr>(*this, ">", std::move(expr));
389 }
390
391 template <SqlExpr Expr>
392 auto operator<(Expr expr) const {
393 return BinaryCondition<CurrentDateTimeExpr, Expr>(*this, "<", std::move(expr));
394 }
395
396 template <SqlExpr Expr>
397 auto operator>=(Expr expr) const {
398 return BinaryCondition<CurrentDateTimeExpr, Expr>(*this, ">=", std::move(expr));
399 }
400
401 template <SqlExpr Expr>
402 auto operator<=(Expr expr) const {
403 return BinaryCondition<CurrentDateTimeExpr, Expr>(*this, "<=", std::move(expr));
404 }
405
406 template <SqlExpr Expr>
407 auto operator==(Expr expr) const {
408 return BinaryCondition<CurrentDateTimeExpr, Expr>(*this, "=", std::move(expr));
409 }
410
411 template <SqlExpr Expr>
412 auto operator!=(Expr expr) const {
413 return BinaryCondition<CurrentDateTimeExpr, Expr>(*this, "!=", std::move(expr));
414 }
415
416private:
417 std::string func_name_;
418};
419
427template <SqlExpr Expr1, SqlExpr Expr2>
428auto date_diff(std::string_view unit, Expr1 date1, Expr2 date2) {
429 return BinaryDateFunctionExpr<Expr1, Expr2>("DATE_DIFF", std::string(unit), std::move(date1),
430 std::move(date2));
431}
432
433// Overload for column types with type checking
434template <typename T1, typename T2>
435 requires date_checking::DateTimeColumn<T1> && date_checking::DateTimeColumn<T2>
436auto date_diff(std::string_view unit, const T1& col1, const T2& col2) {
437 return date_diff(unit, to_expr(col1), to_expr(col2));
438}
439
440// Overload for column and expression
441template <typename T, SqlExpr Expr>
442 requires date_checking::DateTimeColumn<T>
443auto date_diff(std::string_view unit, const T& column, Expr expr) {
444 return date_diff(unit, to_expr(column), std::move(expr));
445}
446
447// Overload for expression and column
448template <SqlExpr Expr, typename T>
449 requires date_checking::DateTimeColumn<T>
450auto date_diff(std::string_view unit, Expr expr, const T& column) {
451 return date_diff(unit, std::move(expr), to_expr(column));
452}
453
459template <SqlExpr DateExpr>
460auto date_add(DateExpr date_expr, IntervalExpr interval_expr) {
461 return DateArithmeticExpr<DateExpr, IntervalExpr>(std::move(date_expr), "+",
462 std::move(interval_expr));
463}
464
465// Overload for column types with type checking
466template <typename T>
467 requires date_checking::DateTimeColumn<T>
468auto date_add(const T& column, IntervalExpr interval_expr) {
469 return date_add(to_expr(column), std::move(interval_expr));
470}
471
477template <SqlExpr DateExpr>
478auto date_sub(DateExpr date_expr, IntervalExpr interval_expr) {
479 return DateArithmeticExpr<DateExpr, IntervalExpr>(std::move(date_expr), "-",
480 std::move(interval_expr));
481}
482
483// Overload for column types with type checking
484template <typename T>
485 requires date_checking::DateTimeColumn<T>
486auto date_sub(const T& column, IntervalExpr interval_expr) {
487 return date_sub(to_expr(column), std::move(interval_expr));
488}
489
496template <SqlExpr Expr>
497auto extract(std::string_view unit, Expr expr) {
498 return UnaryDateFunctionExpr<Expr>("EXTRACT", std::string(unit), std::move(expr));
499}
500
501// Overload for column types with type checking
502template <typename T>
503 requires date_checking::DateTimeColumn<T>
504auto extract(std::string_view unit, const T& column) {
505 return extract(unit, to_expr(column));
506}
507
513template <SqlExpr Expr>
514auto date_trunc(std::string_view unit, Expr expr) {
515 return UnaryDateFunctionExpr<Expr>("DATE_TRUNC", std::string(unit), std::move(expr));
516}
517
518// Overload for column types with type checking
519template <typename T>
520 requires date_checking::DateTimeColumn<T>
521auto date_trunc(std::string_view unit, const T& column) {
522 return date_trunc(unit, to_expr(column));
523}
524
528inline auto interval(std::string_view interval_str) {
529 return IntervalExpr(std::string(interval_str));
530}
531
534inline auto current_date() {
535 return CurrentDateTimeExpr("CURRENT_DATE");
536}
537
540inline auto current_time() {
541 return CurrentDateTimeExpr("CURRENT_TIME");
542}
543
546inline auto current_timestamp() {
547 return CurrentDateTimeExpr("CURRENT_TIMESTAMP");
548}
549
552inline auto now() {
553 return CurrentDateTimeExpr("NOW()");
554}
555
556// Helper functions for common date operations
557
562template <typename T>
563 requires date_checking::DateTimeColumn<T>
564auto age_in_years(const T& birth_date_column) {
565 return date_diff("year", birth_date_column, current_date());
566}
567
568// Overload for any date expression
569template <SqlExpr Expr>
570auto age_in_years(Expr expr) {
571 return date_diff("year", std::move(expr), current_date());
572}
573
578template <typename T>
579 requires date_checking::DateTimeColumn<T>
580auto days_since(const T& date_column) {
581 return date_diff("day", date_column, current_date());
582}
583
584// Overload for any date expression
585template <SqlExpr Expr>
586auto days_since(Expr expr) {
587 return date_diff("day", std::move(expr), current_date());
588}
589
594template <typename T>
595 requires date_checking::DateTimeColumn<T>
596auto days_until(const T& date_column) {
597 return date_diff("day", current_date(), date_column);
598}
599
600// Overload for any date expression
601template <SqlExpr Expr>
602auto days_until(Expr expr) {
603 return date_diff("day", current_date(), std::move(expr));
604}
605
610template <typename T>
611 requires date_checking::DateTimeColumn<T>
612auto start_of_year(const T& date_column) {
613 return date_trunc("year", date_column);
614}
615
616// Overload for any date expression
617template <SqlExpr Expr>
618auto start_of_year(Expr expr) {
619 return date_trunc("year", std::move(expr));
620}
621
626template <typename T>
627 requires date_checking::DateTimeColumn<T>
628auto start_of_month(const T& date_column) {
629 return date_trunc("month", date_column);
630}
631
632// Overload for any date expression
633template <SqlExpr Expr>
634auto start_of_month(Expr expr) {
635 return date_trunc("month", std::move(expr));
636}
637
642template <typename T>
643 requires date_checking::DateTimeColumn<T>
644auto start_of_day(const T& date_column) {
645 return date_trunc("day", date_column);
646}
647
648// Overload for any date expression
649template <SqlExpr Expr>
650auto start_of_day(Expr expr) {
651 return date_trunc("day", std::move(expr));
652}
653
658template <typename T>
659 requires date_checking::DateTimeColumn<T>
660auto year(const T& date_column) {
661 return extract("year", date_column);
662}
663
664// Overload for any date expression
665template <SqlExpr Expr>
666auto year(Expr expr) {
667 return extract("year", std::move(expr));
668}
669
674template <typename T>
675 requires date_checking::DateTimeColumn<T>
676auto month(const T& date_column) {
677 return extract("month", date_column);
678}
679
680// Overload for any date expression
681template <SqlExpr Expr>
682auto month(Expr expr) {
683 return extract("month", std::move(expr));
684}
685
690template <typename T>
691 requires date_checking::DateTimeColumn<T>
692auto day(const T& date_column) {
693 return extract("day", date_column);
694}
695
696// Overload for any date expression
697template <SqlExpr Expr>
698auto day(Expr expr) {
699 return extract("day", std::move(expr));
700}
701
706template <typename T>
707 requires date_checking::DateTimeColumn<T>
708auto day_of_week(const T& date_column) {
709 return extract("dow", date_column);
710}
711
712// Overload for any date expression
713template <SqlExpr Expr>
714auto day_of_week(Expr expr) {
715 return extract("dow", std::move(expr));
716}
717
722template <typename T>
723 requires date_checking::DateTimeColumn<T>
724auto day_of_year(const T& date_column) {
725 return extract("doy", date_column);
726}
727
728// Overload for any date expression
729template <SqlExpr Expr>
730auto day_of_year(Expr expr) {
731 return extract("doy", std::move(expr));
732}
733
738template <typename T>
739 requires date_checking::DateTimeColumn<T>
740auto hour(const T& date_column) {
741 return extract("hour", date_column);
742}
743
744// Overload for any date expression
745template <SqlExpr Expr>
746auto hour(Expr expr) {
747 return extract("hour", std::move(expr));
748}
749
754template <typename T>
755 requires date_checking::DateTimeColumn<T>
756auto minute(const T& date_column) {
757 return extract("minute", date_column);
758}
759
760// Overload for any date expression
761template <SqlExpr Expr>
762auto minute(Expr expr) {
763 return extract("minute", std::move(expr));
764}
765
770template <typename T>
771 requires date_checking::DateTimeColumn<T>
772auto second(const T& date_column) {
773 return extract("second", date_column);
774}
775
776// Overload for any date expression
777template <SqlExpr Expr>
778auto second(Expr expr) {
779 return extract("second", std::move(expr));
780}
781
782// Global operator overloads for date arithmetic with intervals
783
785template <typename T>
786 requires date_checking::DateTimeColumn<T>
787auto operator+(const T& date_column, const IntervalExpr& interval_expr) {
789 interval_expr);
790}
791
793template <SqlExpr DateExpr>
794auto operator+(DateExpr date_expr, const IntervalExpr& interval_expr) {
795 return DateArithmeticExpr<DateExpr, IntervalExpr>(std::move(date_expr), "+", interval_expr);
796}
797
799template <typename T>
800 requires date_checking::DateTimeColumn<T>
801auto operator-(const T& date_column, const IntervalExpr& interval_expr) {
803 interval_expr);
804}
805
807template <SqlExpr DateExpr>
808auto operator-(DateExpr date_expr, const IntervalExpr& interval_expr) {
809 return DateArithmeticExpr<DateExpr, IntervalExpr>(std::move(date_expr), "-", interval_expr);
810}
811
813template <SqlExpr DateExpr, SqlExpr IntervalExpr1>
815 const IntervalExpr& interval_expr) {
817 date_expr, "+", interval_expr);
818}
819
821template <SqlExpr DateExpr, SqlExpr IntervalExpr1>
823 const IntervalExpr& interval_expr) {
825 date_expr, "-", interval_expr);
826}
827
832template <SqlExpr Expr>
833auto abs(Expr expr) {
834 return UnaryDateFunctionExpr<Expr>("ABS", "", std::move(expr));
835}
836
837// Arithmetic operators for UnaryDateFunctionExpr types
838
840template <SqlExpr Expr1, SqlExpr Expr2>
846
848template <SqlExpr Expr1, SqlExpr Expr2>
854
855} // namespace relx::query
Binary arithmetic expression.
Generic binary condition expression.
Definition condition.hpp:16
Binary date function expression (e.g., DATE_DIFF)
Definition date.hpp:23
auto operator>=(LiteralT &&literal) const
Definition date.hpp:111
std::string to_sql() const override
Definition date.hpp:29
auto operator>(LiteralT &&literal) const
Definition date.hpp:95
std::vector< std::string > bind_params() const override
Definition date.hpp:53
BinaryDateFunctionExpr(std::string func_name, std::string unit, Left left, Right right)
Definition date.hpp:25
auto operator==(LiteralT &&literal) const
Definition date.hpp:79
auto operator*(NumericT &&literal) const
Definition date.hpp:127
auto operator+(NumericT &&literal) const
Definition date.hpp:134
auto operator<(LiteralT &&literal) const
Definition date.hpp:103
auto operator<=(LiteralT &&literal) const
Definition date.hpp:119
std::string table_name() const override
Definition date.hpp:62
std::string column_name() const override
Definition date.hpp:60
auto operator/(NumericT &&literal) const
Definition date.hpp:148
auto operator!=(LiteralT &&literal) const
Definition date.hpp:87
auto operator-(NumericT &&literal) const
Definition date.hpp:141
Base class for column expressions.
Current date/time functions (no arguments)
Definition date.hpp:330
auto operator!=(Expr expr) const
Definition date.hpp:412
auto operator==(Expr expr) const
Definition date.hpp:407
auto operator==(const T &column) const
Definition date.hpp:373
std::string table_name() const override
Definition date.hpp:340
auto operator>(const T &column) const
Definition date.hpp:345
auto operator<(const T &column) const
Definition date.hpp:352
auto operator<=(Expr expr) const
Definition date.hpp:402
auto operator>(Expr expr) const
Definition date.hpp:387
auto operator>=(const T &column) const
Definition date.hpp:359
auto operator<(Expr expr) const
Definition date.hpp:392
CurrentDateTimeExpr(std::string func_name)
Definition date.hpp:332
auto operator!=(const T &column) const
Definition date.hpp:380
std::string to_sql() const override
Definition date.hpp:334
std::vector< std::string > bind_params() const override
Definition date.hpp:336
auto operator<=(const T &column) const
Definition date.hpp:366
auto operator>=(Expr expr) const
Definition date.hpp:397
std::string column_name() const override
Definition date.hpp:338
Date addition/subtraction expression.
Definition date.hpp:291
std::string column_name() const override
Definition date.hpp:308
std::string to_sql() const override
Definition date.hpp:297
std::string table_name() const override
Definition date.hpp:316
DateArithmeticExpr(DateExpr date_expr, std::string op, IntervalExpr interval_expr)
Definition date.hpp:293
std::vector< std::string > bind_params() const override
Definition date.hpp:301
Date interval expression for date arithmetic.
Definition date.hpp:273
IntervalExpr(std::string interval)
Definition date.hpp:275
std::string table_name() const override
Definition date.hpp:283
std::string column_name() const override
Definition date.hpp:281
std::vector< std::string > bind_params() const override
Definition date.hpp:279
std::string to_sql() const override
Definition date.hpp:277
Unary date function expression with unit (e.g., EXTRACT)
Definition date.hpp:162
auto operator/(NumericT &&literal) const
Definition date.hpp:261
auto operator==(LiteralT &&literal) const
Definition date.hpp:192
auto operator>=(LiteralT &&literal) const
Definition date.hpp:224
auto operator!=(LiteralT &&literal) const
Definition date.hpp:200
UnaryDateFunctionExpr(std::string func_name, std::string unit, Expr expr)
Definition date.hpp:164
auto operator*(NumericT &&literal) const
Definition date.hpp:240
std::string column_name() const override
Definition date.hpp:179
std::string to_sql() const override
Definition date.hpp:167
auto operator<(LiteralT &&literal) const
Definition date.hpp:216
std::string table_name() const override
Definition date.hpp:181
auto operator>(LiteralT &&literal) const
Definition date.hpp:208
auto operator<=(LiteralT &&literal) const
Definition date.hpp:232
auto operator-(NumericT &&literal) const
Definition date.hpp:254
std::vector< std::string > bind_params() const override
Definition date.hpp:177
auto operator+(NumericT &&literal) const
Definition date.hpp:247
Represents a column in a database table.
Definition column.hpp:217
Check if type is a date/time type (unwrapping optional)
auto current_timestamp()
CURRENT_TIMESTAMP function - returns the current timestamp.
Definition date.hpp:546
auto start_of_day(const T &date_column)
Get the start of the day for a date.
Definition date.hpp:644
auto current_time()
CURRENT_TIME function - returns the current time.
Definition date.hpp:540
auto second(const T &date_column)
Get the second from a timestamp.
Definition date.hpp:772
auto age_in_years(const T &birth_date_column)
Calculate age in years between birth date and current date.
Definition date.hpp:564
auto hour(const T &date_column)
Get the hour from a timestamp.
Definition date.hpp:740
auto interval(std::string_view interval_str)
Create an interval expression.
Definition date.hpp:528
auto start_of_month(const T &date_column)
Get the start of the month for a date.
Definition date.hpp:628
auto start_of_year(const T &date_column)
Get the start of the year for a date.
Definition date.hpp:612
auto year(const T &date_column)
Get the year from a date.
Definition date.hpp:660
auto month(const T &date_column)
Get the month from a date.
Definition date.hpp:676
auto day_of_year(const T &date_column)
Get the day of year from a date (1-366)
Definition date.hpp:724
auto extract(std::string_view unit, Expr expr)
EXTRACT function - extracts a date part from a date.
Definition date.hpp:497
auto day(const T &date_column)
Get the day from a date.
Definition date.hpp:692
auto date_add(DateExpr date_expr, IntervalExpr interval_expr)
DATE_ADD function - adds an interval to a date.
Definition date.hpp:460
auto operator-(const schema::column< TableT1, Name1, T1, Modifiers1... > &left, const schema::column< TableT2, Name2, T2, Modifiers2... > &right)
Subtraction operator for columns.
auto minute(const T &date_column)
Get the minute from a timestamp.
Definition date.hpp:756
auto current_date()
CURRENT_DATE function - returns the current date.
Definition date.hpp:534
auto to_expr(const C &col, std::string_view table_name="")
Helper to wrap a schema column in a SQL expression.
auto days_until(const T &date_column)
Calculate days until a date.
Definition date.hpp:596
auto date_trunc(std::string_view unit, Expr expr)
DATE_TRUNC function - truncates a date to specified precision.
Definition date.hpp:514
auto days_since(const T &date_column)
Calculate days since a date.
Definition date.hpp:580
auto date_diff(std::string_view unit, Expr1 date1, Expr2 date2)
DATE_DIFF function - calculates difference between two dates.
Definition date.hpp:428
auto abs(Expr expr)
ABS function for SQL expressions.
Definition date.hpp:833
auto operator+(const schema::column< TableT1, Name1, T1, Modifiers1... > &left, const schema::column< TableT2, Name2, T2, Modifiers2... > &right)
Addition operator for columns with type checking.
auto day_of_week(const T &date_column)
Get the day of week from a date (0=Sunday, 1=Monday, etc.)
Definition date.hpp:708
auto val(const char *str)
Helper to create a value expression from a string literal.
Definition value.hpp:127
auto now()
NOW function - alias for CURRENT_TIMESTAMP.
Definition date.hpp:552
auto date_sub(DateExpr date_expr, IntervalExpr interval_expr)
DATE_SUB function - subtracts an interval from a date.
Definition date.hpp:478
STL namespace.