Skip to main content

linkrs_query/executor/expression/functions/builtin/
datetime.rs

1mod arithmetic;
2mod constructors;
3mod epoch;
4mod extraction;
5mod formatting;
6mod generate;
7mod interval;
8mod truncation;
9
10use arithmetic::*;
11use constructors::*;
12use epoch::*;
13use extraction::*;
14use formatting::*;
15use generate::*;
16use interval::*;
17use truncation::*;
18
19use crate::executor::expression::ExpressionError;
20use linkrs_core::Value;
21
22define_function_enum! {
23    pub enum DateTimeFunction {
24        Now => {
25            name: "now",
26            arity: 0,
27            variadic: false,
28            description: "current timestamp",
29            handler: execute_now
30        },
31        Date => {
32            name: "date",
33            arity: 1,
34            variadic: true,
35            description: "Date of creation",
36            handler: execute_date
37        },
38        Time => {
39            name: "time",
40            arity: 1,
41            variadic: true,
42            description: "Creation time",
43            handler: execute_time
44        },
45        DateTime => {
46            name: "datetime",
47            arity: 0,
48            variadic: true,
49            description: "Creation date and time",
50            handler: execute_datetime
51        },
52        Year => {
53            name: "year",
54            arity: 1,
55            variadic: false,
56            description: "Year of extraction",
57            handler: execute_year
58        },
59        Month => {
60            name: "month",
61            arity: 1,
62            variadic: false,
63            description: "Month of withdrawal",
64            handler: execute_month
65        },
66        Day => {
67            name: "day",
68            arity: 1,
69            variadic: false,
70            description: "Withdrawal date",
71            handler: execute_day
72        },
73        Hour => {
74            name: "hour",
75            arity: 1,
76            variadic: false,
77            description: "Withdrawal hours",
78            handler: execute_hour
79        },
80        Minute => {
81            name: "minute",
82            arity: 1,
83            variadic: false,
84            description: "Extraction minutes",
85            handler: execute_minute
86        },
87        Second => {
88            name: "second",
89            arity: 1,
90            variadic: false,
91            description: "withdrawal second",
92            handler: execute_second
93        },
94        TimeStamp => {
95            name: "timestamp",
96            arity: 0,
97            variadic: true,
98            description: "Get current timestamp or convert datetime to timestamp",
99            handler: execute_timestamp
100        },
101        DateAdd => {
102            name: "date_add",
103            arity: 2,
104            variadic: false,
105            description: "Add interval to date/datetime",
106            handler: execute_date_add
107        },
108        DateSub => {
109            name: "date_sub",
110            arity: 2,
111            variadic: false,
112            description: "Subtract interval from date/datetime",
113            handler: execute_date_sub
114        },
115        DateDiff => {
116            name: "date_diff",
117            arity: 2,
118            variadic: false,
119            description: "Calculate difference between two dates/datetimes",
120            handler: execute_date_diff
121        },
122        DateTrunc => {
123            name: "date_trunc",
124            arity: 2,
125            variadic: false,
126            description: "Truncate date/datetime to specified precision",
127            handler: execute_date_trunc
128        },
129        CurrentDate => {
130            name: "current_date",
131            arity: 0,
132            variadic: false,
133            description: "Get current date",
134            handler: execute_current_date
135        },
136        CurrentTimestamp => {
137            name: "current_timestamp",
138            arity: 0,
139            variadic: false,
140            description: "Get current timestamp",
141            handler: execute_current_timestamp
142        },
143        ToChar => {
144            name: "to_char",
145            arity: 2,
146            variadic: false,
147            description: "Format datetime as string",
148            handler: execute_to_char
149        },
150        ToDate => {
151            name: "to_date",
152            arity: 1,
153            variadic: false,
154            description: "Convert string to date",
155            handler: execute_to_date
156        },
157        Age => {
158            name: "age",
159            arity: 1,
160            variadic: false,
161            description: "Calculate age/interval from date/datetime to now",
162            handler: execute_age
163        },
164        LastDay => {
165            name: "last_day",
166            arity: 1,
167            variadic: false,
168            description: "Get last day of the month",
169            handler: execute_last_day
170        },
171        GenerateSeries => {
172            name: "generate_series",
173            arity: 2,
174            variadic: true,
175            description: "Generate a series of timestamps",
176            handler: execute_generate_series
177        },
178        ToYears => {
179            name: "to_years",
180            arity: 1,
181            variadic: false,
182            description: "Convert number to years interval",
183            handler: execute_to_years
184        },
185        ToMonths => {
186            name: "to_months",
187            arity: 1,
188            variadic: false,
189            description: "Convert number to months interval",
190            handler: execute_to_months
191        },
192        ToDays => {
193            name: "to_days",
194            arity: 1,
195            variadic: false,
196            description: "Convert number to days interval",
197            handler: execute_to_days
198        },
199        ToHours => {
200            name: "to_hours",
201            arity: 1,
202            variadic: false,
203            description: "Convert number to hours interval",
204            handler: execute_to_hours
205        },
206        ToMinutes => {
207            name: "to_minutes",
208            arity: 1,
209            variadic: false,
210            description: "Convert number to minutes interval",
211            handler: execute_to_minutes
212        },
213        ToSeconds => {
214            name: "to_seconds",
215            arity: 1,
216            variadic: false,
217            description: "Convert number to seconds interval",
218            handler: execute_to_seconds
219        },
220        ToMilliseconds => {
221            name: "to_milliseconds",
222            arity: 1,
223            variadic: false,
224            description: "Convert number to milliseconds interval",
225            handler: execute_to_milliseconds
226        },
227        ToMicroseconds => {
228            name: "to_microseconds",
229            arity: 1,
230            variadic: false,
231            description: "Convert number to microseconds interval",
232            handler: execute_to_microseconds
233        },
234        Century => {
235            name: "century",
236            arity: 1,
237            variadic: false,
238            description: "Extract century from date/datetime",
239            handler: execute_century
240        },
241        EpochMs => {
242            name: "epoch_ms",
243            arity: 1,
244            variadic: false,
245            description: "Convert date/datetime to epoch milliseconds",
246            handler: execute_epoch_ms
247        },
248        ToTimestamp => {
249            name: "to_timestamp",
250            arity: 1,
251            variadic: false,
252            description: "Convert epoch seconds to timestamp",
253            handler: execute_to_timestamp
254        },
255        ToEpochMs => {
256            name: "to_epoch_ms",
257            arity: 1,
258            variadic: false,
259            description: "Convert date/datetime to epoch milliseconds",
260            handler: execute_to_epoch_ms
261        },
262        DatePart => {
263            name: "date_part",
264            arity: 2,
265            variadic: false,
266            description: "Extract date part (year, month, day, hour, minute, second, dow, doy, quarter)",
267            handler: execute_date_part
268        },
269        DayName => {
270            name: "day_name",
271            arity: 1,
272            variadic: false,
273            description: "Get day name from date/datetime",
274            handler: execute_day_name
275        },
276        MonthName => {
277            name: "month_name",
278            arity: 1,
279            variadic: false,
280            description: "Get month name from date/datetime",
281            handler: execute_month_name
282        },
283    }
284}
285
286impl DateTimeFunction {
287    pub fn execute_with_cache(
288        &self,
289        args: &[Value],
290        _cache: &mut (),
291    ) -> Result<Value, ExpressionError> {
292        self.execute(args)
293    }
294}
295
296#[cfg(test)]
297mod tests;