File tree Expand file tree Collapse file tree 3 files changed +102
-0
lines changed
Filter options
Expand file tree Collapse file tree 3 files changed +102
-0
lines changed
Original file line number Diff line number Diff line change @@ -3846,6 +3846,13 @@ timestamp_bin(PG_FUNCTION_ARGS)
3846
3846
tm_diff = timestamp - origin ;
3847
3847
tm_delta = tm_diff - tm_diff % stride_usecs ;
3848
3848
3849
+ /*
3850
+ * Make sure the returned timestamp is at the start of the bin,
3851
+ * even if the origin is in the future.
3852
+ */
3853
+ if (origin > timestamp && stride_usecs > 1 )
3854
+ tm_delta -= stride_usecs ;
3855
+
3849
3856
result = origin + tm_delta ;
3850
3857
3851
3858
PG_RETURN_TIMESTAMP (result );
@@ -4017,6 +4024,13 @@ timestamptz_bin(PG_FUNCTION_ARGS)
4017
4024
tm_diff = timestamp - origin ;
4018
4025
tm_delta = tm_diff - tm_diff % stride_usecs ;
4019
4026
4027
+ /*
4028
+ * Make sure the returned timestamp is at the start of the bin,
4029
+ * even if the origin is in the future.
4030
+ */
4031
+ if (origin > timestamp && stride_usecs > 1 )
4032
+ tm_delta -= stride_usecs ;
4033
+
4020
4034
result = origin + tm_delta ;
4021
4035
4022
4036
PG_RETURN_TIMESTAMPTZ (result );
Original file line number Diff line number Diff line change @@ -609,6 +609,60 @@ FROM (
609
609
microsecond | 1 us | t
610
610
(7 rows)
611
611
612
+ -- case 3: AD dates, origin > input
613
+ SELECT
614
+ str,
615
+ interval,
616
+ date_trunc(str, ts) = date_bin(interval::interval, ts, timestamp '2020-03-02') AS equal
617
+ FROM (
618
+ VALUES
619
+ ('week', '7 d'),
620
+ ('day', '1 d'),
621
+ ('hour', '1 h'),
622
+ ('minute', '1 m'),
623
+ ('second', '1 s'),
624
+ ('millisecond', '1 ms'),
625
+ ('microsecond', '1 us')
626
+ ) intervals (str, interval),
627
+ (VALUES (timestamp '2020-02-29 15:44:17.71393')) ts (ts);
628
+ str | interval | equal
629
+ -------------+----------+-------
630
+ week | 7 d | t
631
+ day | 1 d | t
632
+ hour | 1 h | t
633
+ minute | 1 m | t
634
+ second | 1 s | t
635
+ millisecond | 1 ms | t
636
+ microsecond | 1 us | t
637
+ (7 rows)
638
+
639
+ -- case 4: BC dates, origin > input
640
+ SELECT
641
+ str,
642
+ interval,
643
+ date_trunc(str, ts) = date_bin(interval::interval, ts, timestamp '0055-06-17 BC') AS equal
644
+ FROM (
645
+ VALUES
646
+ ('week', '7 d'),
647
+ ('day', '1 d'),
648
+ ('hour', '1 h'),
649
+ ('minute', '1 m'),
650
+ ('second', '1 s'),
651
+ ('millisecond', '1 ms'),
652
+ ('microsecond', '1 us')
653
+ ) intervals (str, interval),
654
+ (VALUES (timestamp '0055-6-10 15:44:17.71393 BC')) ts (ts);
655
+ str | interval | equal
656
+ -------------+----------+-------
657
+ week | 7 d | t
658
+ day | 1 d | t
659
+ hour | 1 h | t
660
+ minute | 1 m | t
661
+ second | 1 s | t
662
+ millisecond | 1 ms | t
663
+ microsecond | 1 us | t
664
+ (7 rows)
665
+
612
666
-- bin timestamps into arbitrary intervals
613
667
SELECT
614
668
interval,
Original file line number Diff line number Diff line change @@ -203,6 +203,40 @@ FROM (
203
203
) intervals (str, interval),
204
204
(VALUES (timestamp ' 0055-6-10 15:44:17.71393 BC' )) ts (ts);
205
205
206
+ -- case 3: AD dates, origin > input
207
+ SELECT
208
+ str,
209
+ interval,
210
+ date_trunc(str, ts) = date_bin(interval::interval, ts, timestamp ' 2020-03-02' ) AS equal
211
+ FROM (
212
+ VALUES
213
+ (' week' , ' 7 d' ),
214
+ (' day' , ' 1 d' ),
215
+ (' hour' , ' 1 h' ),
216
+ (' minute' , ' 1 m' ),
217
+ (' second' , ' 1 s' ),
218
+ (' millisecond' , ' 1 ms' ),
219
+ (' microsecond' , ' 1 us' )
220
+ ) intervals (str, interval),
221
+ (VALUES (timestamp ' 2020-02-29 15:44:17.71393' )) ts (ts);
222
+
223
+ -- case 4: BC dates, origin > input
224
+ SELECT
225
+ str,
226
+ interval,
227
+ date_trunc(str, ts) = date_bin(interval::interval, ts, timestamp ' 0055-06-17 BC' ) AS equal
228
+ FROM (
229
+ VALUES
230
+ (' week' , ' 7 d' ),
231
+ (' day' , ' 1 d' ),
232
+ (' hour' , ' 1 h' ),
233
+ (' minute' , ' 1 m' ),
234
+ (' second' , ' 1 s' ),
235
+ (' millisecond' , ' 1 ms' ),
236
+ (' microsecond' , ' 1 us' )
237
+ ) intervals (str, interval),
238
+ (VALUES (timestamp ' 0055-6-10 15:44:17.71393 BC' )) ts (ts);
239
+
206
240
-- bin timestamps into arbitrary intervals
207
241
SELECT
208
242
interval,
You can’t perform that action at this time.
0 commit comments