@@ -121,6 +121,151 @@ SELECT WEEK(birth_date) week, birth_date FROM test_emp WHERE WEEK(birth_date) >
1211212 |1953-01-07T00:00:00.000Z
122122;
123123
124+ selectDateTruncWithDateTime
125+ schema::dt_hour:ts|dt_min:ts|dt_sec:ts|dt_millis:s|dt_micro:s|dt_nano:s
126+ SELECT DATE_TRUNC('hour', '2019-09-04T11:22:33.123Z'::datetime) as dt_hour, DATE_TRUNC('minute', '2019-09-04T11:22:33.123Z'::datetime) as dt_min,
127+ DATE_TRUNC('seconds', '2019-09-04T11:22:33.123Z'::datetime) as dt_sec, DATE_TRUNC('ms', '2019-09-04T11:22:33.123Z'::datetime)::string as dt_millis,
128+ DATE_TRUNC('mcs', '2019-09-04T11:22:33.123Z'::datetime)::string as dt_micro, DATE_TRUNC('nanoseconds', '2019-09-04T11:22:33.123Z'::datetime)::string as dt_nano;
129+
130+ dt_hour | dt_min | dt_sec | dt_millis | dt_micro | dt_nano
131+ -------------------------+---------------------------+--------------------------+--------------------------+--------------------------+-------------------------
132+ 2019-09-04T11:00:00.000Z | 2019-09-04T11:22:00.000Z | 2019-09-04T11:22:33.000Z | 2019-09-04T11:22:33.123Z | 2019-09-04T11:22:33.123Z | 2019-09-04T11:22:33.123Z
133+ ;
134+
135+ selectDateTruncWithDate
136+ schema::dt_mil:ts|dt_cent:ts|dt_dec:ts|dt_year:ts|dt_quarter:ts|dt_month:ts|dt_week:ts|dt_day:ts
137+ SELECT DATE_TRUNC('millennia', '2019-09-04'::date) as dt_mil, DATE_TRUNC('century', '2019-09-04'::date) as dt_cent,
138+ DATE_TRUNC('decades', '2019-09-04'::date) as dt_dec, DATE_TRUNC('year', '2019-09-04'::date) as dt_year,
139+ DATE_TRUNC('quarter', '2019-09-04'::date) as dt_quarter, DATE_TRUNC('month', '2019-09-04'::date) as dt_month,
140+ DATE_TRUNC('week', '2019-09-04'::date) as dt_week, DATE_TRUNC('day', '2019-09-04'::date) as dt_day;
141+
142+ dt_mil | dt_cent | dt_dec | dt_year | dt_quarter | dt_month | dt_week | dt_day
143+ -------------------------+--------------------------+--------------------------+--------------------------+--------------------------+--------------------------+--------------------------+-------------------------
144+ 2000-01-01T00:00:00.000Z | 2000-01-01T00:00:00.000Z | 2010-01-01T00:00:00.000Z | 2019-01-01T00:00:00.000Z | 2019-07-01T00:00:00.000Z | 2019-09-01T00:00:00.000Z | 2019-09-02T00:00:00.000Z | 2019-09-04T00:00:00.000Z
145+ ;
146+
147+ selectDateTruncWithField
148+ schema::emp_no:i|birth_date:ts|dt_mil:ts|dt_cent:ts|dt_dec:ts|dt_year:ts|dt_quarter:ts|dt_month:ts|dt_week:ts|dt_day:ts
149+ SELECT emp_no, birth_date, DATE_TRUNC('millennium', birth_date) as dt_mil, DATE_TRUNC('centuries', birth_date) as dt_cent,
150+ DATE_TRUNC('decades', birth_date) as dt_dec, DATE_TRUNC('year', birth_date) as dt_year, DATE_TRUNC('quarter', birth_date) as dt_quarter,
151+ DATE_TRUNC('month', birth_date) as dt_month, DATE_TRUNC('week', birth_date) as dt_week, DATE_TRUNC('day', birth_date) as dt_day
152+ FROM test_emp WHERE emp_no >= 10032 AND emp_no <= 10042 ORDER BY 1;
153+
154+ emp_no | birth_date | dt_mil | dt_cent | dt_dec | dt_year | dt_quarter | dt_month | dt_week | dt_day
155+ --------+-------------------------+--------------------------+--------------------------+--------------------------+--------------------------+--------------------------+--------------------------+--------------------------+-------------------------
156+ 10032 |1960-08-09 00:00:00.000Z | 0999-12-27 00:00:00.000Z | 1900-01-01 00:00:00.000Z | 1960-01-01 00:00:00.000Z | 1960-01-01 00:00:00.000Z | 1960-07-01 00:00:00.000Z | 1960-08-01 00:00:00.000Z | 1960-08-08 00:00:00.000Z | 1960-08-09 00:00:00.000Z
157+ 10033 |1956-11-14 00:00:00.000Z | 0999-12-27 00:00:00.000Z | 1900-01-01 00:00:00.000Z | 1950-01-01 00:00:00.000Z | 1956-01-01 00:00:00.000Z | 1956-10-01 00:00:00.000Z | 1956-11-01 00:00:00.000Z | 1956-11-12 00:00:00.000Z | 1956-11-14 00:00:00.000Z
158+ 10034 |1962-12-29 00:00:00.000Z | 0999-12-27 00:00:00.000Z | 1900-01-01 00:00:00.000Z | 1960-01-01 00:00:00.000Z | 1962-01-01 00:00:00.000Z | 1962-10-01 00:00:00.000Z | 1962-12-01 00:00:00.000Z | 1962-12-24 00:00:00.000Z | 1962-12-29 00:00:00.000Z
159+ 10035 |1953-02-08 00:00:00.000Z | 0999-12-27 00:00:00.000Z | 1900-01-01 00:00:00.000Z | 1950-01-01 00:00:00.000Z | 1953-01-01 00:00:00.000Z | 1953-01-01 00:00:00.000Z | 1953-02-01 00:00:00.000Z | 1953-02-02 00:00:00.000Z | 1953-02-08 00:00:00.000Z
160+ 10036 |1959-08-10 00:00:00.000Z | 0999-12-27 00:00:00.000Z | 1900-01-01 00:00:00.000Z | 1950-01-01 00:00:00.000Z | 1959-01-01 00:00:00.000Z | 1959-07-01 00:00:00.000Z | 1959-08-01 00:00:00.000Z | 1959-08-10 00:00:00.000Z | 1959-08-10 00:00:00.000Z
161+ 10037 |1963-07-22 00:00:00.000Z | 0999-12-27 00:00:00.000Z | 1900-01-01 00:00:00.000Z | 1960-01-01 00:00:00.000Z | 1963-01-01 00:00:00.000Z | 1963-07-01 00:00:00.000Z | 1963-07-01 00:00:00.000Z | 1963-07-22 00:00:00.000Z | 1963-07-22 00:00:00.000Z
162+ 10038 |1960-07-20 00:00:00.000Z | 0999-12-27 00:00:00.000Z | 1900-01-01 00:00:00.000Z | 1960-01-01 00:00:00.000Z | 1960-01-01 00:00:00.000Z | 1960-07-01 00:00:00.000Z | 1960-07-01 00:00:00.000Z | 1960-07-18 00:00:00.000Z | 1960-07-20 00:00:00.000Z
163+ 10039 |1959-10-01 00:00:00.000Z | 0999-12-27 00:00:00.000Z | 1900-01-01 00:00:00.000Z | 1950-01-01 00:00:00.000Z | 1959-01-01 00:00:00.000Z | 1959-10-01 00:00:00.000Z | 1959-10-01 00:00:00.000Z | 1959-09-28 00:00:00.000Z | 1959-10-01 00:00:00.000Z
164+ 10040 | null | null | null | null | null | null | null | null | null
165+ 10041 | null | null | null | null | null | null | null | null | null
166+ 10042 | null | null | null | null | null | null | null | null | null
167+ ;
168+
169+ selectDateTruncWithNullTruncateField
170+ SELECT DATE_TRUNC(null, birth_date) AS dt FROM test_emp LIMIT 5;
171+
172+ dt:ts
173+ ------
174+ null
175+ null
176+ null
177+ null
178+ null
179+ ;
180+
181+ selectDateTruncWithScalars
182+ SELECT birth_date, DATE_TRUNC(CAST(CHAR(109) AS VARCHAR), birth_date + INTERVAL 12 YEAR) AS dt FROM test_emp ORDER BY 1 DESC NULLS LAST LIMIT 5;
183+
184+ birth_date:ts | dt:ts
185+ -------------------------+---------------------
186+ 1965-01-03 00:00:00.000Z | 1977-01-01 00:00:00.000Z
187+ 1964-10-18 00:00:00.000Z | 1976-10-01 00:00:00.000Z
188+ 1964-06-11 00:00:00.000Z | 1976-06-01 00:00:00.000Z
189+ 1964-06-02 00:00:00.000Z | 1976-06-01 00:00:00.000Z
190+ 1964-04-18 00:00:00.000Z | 1976-04-01 00:00:00.000Z
191+ ;
192+
193+ selectDateTruncWithTruncArgFromField
194+ SELECT DATE_TRUNC(CONCAT(gender, 'illennium'), birth_date) AS dt FROM test_emp WHERE gender='M' ORDER BY 1 DESC LIMIT 2;
195+
196+ dt:ts
197+ ------------------------
198+ 0999-12-27 00:00:00.000Z
199+ 0999-12-27 00:00:00.000Z
200+ ;
201+
202+ selectDateTruncWithComplexExpressions
203+ SELECT gender, birth_date, DATE_TRUNC(CASE WHEN gender = 'M' THEN CONCAT(gender, 'onths') WHEN gender = 'F' THEN 'decade' ELSE 'quarter' END,
204+ birth_date + INTERVAL 10 month) AS dt FROM test_emp WHERE dt > '1954-07-01'::date ORDER BY emp_no LIMIT 10;
205+
206+ gender:s | birth_date:ts | dt:ts
207+ ------------+--------------------------+---------------------
208+ F | 1964-06-02 00:00:00.000Z | 1960-01-01 00:00:00.000Z
209+ M | 1959-12-03 00:00:00.000Z | 1960-10-01 00:00:00.000Z
210+ M | 1954-05-01 00:00:00.000Z | 1955-03-01 00:00:00.000Z
211+ M | 1955-01-21 00:00:00.000Z | 1955-11-01 00:00:00.000Z
212+ M | 1958-02-19 00:00:00.000Z | 1958-12-01 00:00:00.000Z
213+ null | 1963-06-01 00:00:00.000Z | 1964-04-01 00:00:00.000Z
214+ null | 1960-10-04 00:00:00.000Z | 1961-07-01 00:00:00.000Z
215+ null | 1963-06-07 00:00:00.000Z | 1964-04-01 00:00:00.000Z
216+ null | 1956-02-12 00:00:00.000Z | 1956-10-01 00:00:00.000Z
217+ null | 1959-08-19 00:00:00.000Z | 1960-04-01 00:00:00.000Z
218+ ;
219+
220+ dateTruncOrderBy
221+ schema::emp_no:i|hire_date:ts|dt:ts
222+ SELECT emp_no, hire_date, DATE_TRUNC('quarter', hire_date) as dt FROM test_emp ORDER BY dt NULLS LAST, emp_no LIMIT 5;
223+
224+ emp_no | hire_date | dt
225+ --------+--------------------------+-------------------------
226+ 10009 | 1985-02-18 00:00:00.000Z | 1985-01-01 00:00:00.000Z
227+ 10048 | 1985-02-24 00:00:00.000Z | 1985-01-01 00:00:00.000Z
228+ 10098 | 1985-05-13 00:00:00.000Z | 1985-04-01 00:00:00.000Z
229+ 10061 | 1985-09-17 00:00:00.000Z | 1985-07-01 00:00:00.000Z
230+ 10076 | 1985-07-09 00:00:00.000Z | 1985-07-01 00:00:00.000Z
231+ ;
232+
233+ dateTruncFilter
234+ schema::emp_no:i|hire_date:ts|dt:ts
235+ SELECT emp_no, hire_date, DATE_TRUNC('quarter', hire_date) as dt FROM test_emp WHERE DATE_TRUNC('quarter', hire_date) > '1994-07-01T00:00:00.000Z'::timestamp ORDER BY emp_no;
236+
237+ emp_no | hire_date | dt
238+ --------+--------------------------+-------------------------
239+ 10016 | 1995-01-27 00:00:00.000Z | 1995-01-01 00:00:00.000Z
240+ 10019 | 1999-04-30 00:00:00.000Z | 1999-04-01 00:00:00.000Z
241+ 10022 | 1995-08-22 00:00:00.000Z | 1995-07-01 00:00:00.000Z
242+ 10024 | 1997-05-19 00:00:00.000Z | 1997-04-01 00:00:00.000Z
243+ 10026 | 1995-03-20 00:00:00.000Z | 1995-01-01 00:00:00.000Z
244+ 10054 | 1995-03-13 00:00:00.000Z | 1995-01-01 00:00:00.000Z
245+ 10084 | 1995-12-15 00:00:00.000Z | 1995-10-01 00:00:00.000Z
246+ 10093 | 1996-11-05 00:00:00.000Z | 1996-10-01 00:00:00.000Z
247+ ;
248+
249+ dateTruncGroupBy
250+ schema::count:l|dt:ts
251+ SELECT count(*) as count, DATE_TRUNC('decade', hire_date) dt FROM test_emp GROUP BY dt ORDER BY 2;
252+
253+ count | dt
254+ --------+-------------------------
255+ 59 | 1980-01-01 00:00:00.000Z
256+ 41 | 1990-01-01 00:00:00.000Z
257+ ;
258+
259+ dateTruncHaving
260+ schema::gender:s|dt:ts
261+ SELECT gender, max(hire_date) dt FROM test_emp GROUP BY gender HAVING DATE_TRUNC('year', max(hire_date)) >= '1997-01-01T00:00:00.000Z'::timestamp ORDER BY 1;
262+
263+ gender | dt
264+ --------+-------------------------
265+ null | 1999-04-30 00:00:00.000Z
266+ F | 1997-05-19 00:00:00.000Z
267+ ;
268+
124269//
125270// Aggregate
126271//
@@ -404,4 +549,4 @@ SELECT CAST (CAST (birth_date AS VARCHAR) AS TIMESTAMP) a FROM test_emp WHERE YE
404549 a:ts
405550---------------
4065511965-01-03T00:00:00Z
407- ;
552+ ;
0 commit comments