data_faking/data/datetime/
sql.rs

1// NAIVE date datetime timestamp generation for sql targets
2
3/*
4https://learn.microsoft.com/en-us/sql/t-sql/functions/date-and-time-data-types-and-functions-transact-sql?view=sql-server-ver16
5
6Data type	Format	Range	Accuracy	Storage size (bytes)	User-defined fractional second precision	Time zone offset
7time	hh:mm:ss[.nnnnnnn]	00:00:00.0000000 through 23:59:59.9999999	100 nanoseconds	3 to 5	Yes	No
8date	YYYY-MM-DD	0001-01-01 through 9999-12-31	1 day	3	No	No
9smalldatetime	YYYY-MM-DD hh:mm:ss	1900-01-01 through 2079-06-06	1 minute	4	No	No
10datetime	YYYY-MM-DD hh:mm:ss[.nnn]	1753-01-01 through 9999-12-31	0.00333 second	8	No	No
11
12datetime2	YYYY-MM-DD hh:mm:ss[.nnn nnnn]	0001-01-01 00:00:00.0000000 through 9999-12-31 23:59:59.9999999	100 nanoseconds	6 to 8	Yes	No
13datetimeoffset	YYYY-MM-DD hh:mm:ss[.nnn nnnn] [+|-]hh:mm	0001-01-01 00:00:00.0000000 through 9999-12-31 23:59:59.9999999 (in UTC)
14 */
15
16use crate::utils::seeder;
17use wasm_bindgen::prelude::*;
18
19// TEMP
20pub const YEAR_MIN: i32 = 1971;
21pub const YEAR_MAX: i32 = 2037;
22
23pub const MONTH_MIN: i32 = 1;
24pub const MONTH_MAX: i32 = 12;
25
26// NOTE(clearfeld): TEMP use chrono to get days in month do not use 28 limit
27pub const DAYS_MIN: i32 = 1;
28pub const DAYS_MAX: i32 = 28;
29
30pub const HOURS_MIN: i32 = 0;
31pub const HOURS_MAX: i32 = 23;
32
33pub const MINUTES_MIN: i32 = 0;
34pub const MINUTES_MAX: i32 = 59;
35
36pub const SECONDS_MIN: i32 = 0;
37pub const SECONDS_MAX: i32 = 59;
38
39pub const NANO_MIN: i32 = 0;
40pub const NANO_MAX: i32 = 23;
41
42// SQL Server
43
44// PostgreSQL and MySQL
45// MySQL - TIMESTAMP has a range of '1970-01-01 00:00:01' UTC to '2038-01-19 03:14:07' UTC.
46// MySQL - DATETIME supported range is '1000-01-01 00:00:00' to '9999-12-31 23:59:59'.
47
48fn zero_pad_string(arg: i32) -> String {
49    if arg < 10 {
50        format!("0{}",arg)
51    } else {
52        arg.to_string()
53    }
54}
55
56#[wasm_bindgen]
57pub fn sql_time() -> String {
58	format!(
59		"{}:{}:{}",
60		zero_pad_string(seeder::gen_range(HOURS_MIN..=HOURS_MAX)),
61		zero_pad_string(seeder::gen_range(MINUTES_MIN..=MINUTES_MAX)),
62		zero_pad_string(seeder::gen_range(SECONDS_MIN..=SECONDS_MAX))
63	)
64}
65
66#[wasm_bindgen]
67pub fn sql_server_time() -> String {
68	format!(
69		"{}:{}:{}.{}{}{}{}{}{}{}",
70		zero_pad_string(seeder::gen_range(HOURS_MIN..=HOURS_MAX)),
71		zero_pad_string(seeder::gen_range(MINUTES_MIN..=MINUTES_MAX)),
72		zero_pad_string(seeder::gen_range(SECONDS_MIN..=SECONDS_MAX)),
73
74        seeder::gen_range(0..=9),
75        seeder::gen_range(0..=9),
76        seeder::gen_range(0..=9),
77        seeder::gen_range(0..=9),
78        seeder::gen_range(0..=9),
79        seeder::gen_range(0..=9),
80        seeder::gen_range(0..=9)
81	)
82}
83
84#[wasm_bindgen]
85pub fn sql_date() -> String {
86	format!(
87		"{}-{}-{}",
88		zero_pad_string(seeder::gen_range(YEAR_MIN..=YEAR_MAX)),
89		zero_pad_string(seeder::gen_range(MONTH_MIN..=MONTH_MAX)),
90		zero_pad_string(seeder::gen_range(DAYS_MIN..=DAYS_MAX))
91	)
92}
93
94#[wasm_bindgen]
95pub fn sql_datetime() -> String {
96	format!(
97		"{}-{}-{} {}:{}:{}.{}{}{}{}{}",
98		zero_pad_string(seeder::gen_range(YEAR_MIN..=YEAR_MAX)),
99		zero_pad_string(seeder::gen_range(MONTH_MIN..=MONTH_MAX)),
100		zero_pad_string(seeder::gen_range(DAYS_MIN..=DAYS_MAX)),
101
102		zero_pad_string(seeder::gen_range(HOURS_MIN..=HOURS_MAX)),
103		zero_pad_string(seeder::gen_range(MINUTES_MIN..=MINUTES_MAX)),
104		zero_pad_string(seeder::gen_range(SECONDS_MIN..=SECONDS_MAX)),
105
106        seeder::gen_range(0..=9),
107        seeder::gen_range(0..=9),
108        seeder::gen_range(0..=9),
109        seeder::gen_range(0..=9),
110        seeder::gen_range(0..=9)
111	)
112}
113
114#[wasm_bindgen]
115pub fn sql_server_datetime() -> String {
116	format!(
117		"{}-{}-{} {}:{}:{}.{}{}{}",
118		zero_pad_string(seeder::gen_range(YEAR_MIN..=YEAR_MAX)),
119		zero_pad_string(seeder::gen_range(MONTH_MIN..=MONTH_MAX)),
120		zero_pad_string(seeder::gen_range(DAYS_MIN..=DAYS_MAX)),
121
122		zero_pad_string(seeder::gen_range(HOURS_MIN..=HOURS_MAX)),
123		zero_pad_string(seeder::gen_range(MINUTES_MIN..=MINUTES_MAX)),
124		zero_pad_string(seeder::gen_range(SECONDS_MIN..=SECONDS_MAX)),
125
126        seeder::gen_range(0..=9),
127        seeder::gen_range(0..=9),
128        seeder::gen_range(0..=9)
129	)
130}
131
132#[wasm_bindgen]
133pub fn sql_server_datetime2() -> String {
134	format!(
135		"{}-{}-{} {}:{}:{}.{}{}{}{}{}{}{}",
136		zero_pad_string(seeder::gen_range(YEAR_MIN..=YEAR_MAX)),
137		zero_pad_string(seeder::gen_range(MONTH_MIN..=MONTH_MAX)),
138		zero_pad_string(seeder::gen_range(DAYS_MIN..=DAYS_MAX)),
139
140		zero_pad_string(seeder::gen_range(HOURS_MIN..=HOURS_MAX)),
141		zero_pad_string(seeder::gen_range(MINUTES_MIN..=MINUTES_MAX)),
142		zero_pad_string(seeder::gen_range(SECONDS_MIN..=SECONDS_MAX)),
143
144        seeder::gen_range(0..=9),
145        seeder::gen_range(0..=9),
146        seeder::gen_range(0..=9),
147        seeder::gen_range(0..=9),
148        seeder::gen_range(0..=9),
149        seeder::gen_range(0..=9),
150        seeder::gen_range(0..=9)
151	)
152}