@@ -545,6 +545,102 @@ SELECT date_trunc( 'week', timestamp '2004-02-29 15:44:17.71393' ) AS week_trunc
545
545
Mon Feb 23 00:00:00 2004
546
546
(1 row)
547
547
548
+ -- verify date_bin behaves the same as date_trunc for relevant intervals
549
+ -- case 1: AD dates, origin < input
550
+ SELECT
551
+ str,
552
+ interval,
553
+ date_trunc(str, ts) = date_bin(interval::interval, ts, timestamp '2001-01-01') AS equal
554
+ FROM (
555
+ VALUES
556
+ ('week', '7 d'),
557
+ ('day', '1 d'),
558
+ ('hour', '1 h'),
559
+ ('minute', '1 m'),
560
+ ('second', '1 s'),
561
+ ('millisecond', '1 ms'),
562
+ ('microsecond', '1 us')
563
+ ) intervals (str, interval),
564
+ (VALUES (timestamp '2020-02-29 15:44:17.71393')) ts (ts);
565
+ str | interval | equal
566
+ -------------+----------+-------
567
+ week | 7 d | t
568
+ day | 1 d | t
569
+ hour | 1 h | t
570
+ minute | 1 m | t
571
+ second | 1 s | t
572
+ millisecond | 1 ms | t
573
+ microsecond | 1 us | t
574
+ (7 rows)
575
+
576
+ -- case 2: BC dates, origin < input
577
+ SELECT
578
+ str,
579
+ interval,
580
+ date_trunc(str, ts) = date_bin(interval::interval, ts, timestamp '2000-01-01 BC') AS equal
581
+ FROM (
582
+ VALUES
583
+ ('week', '7 d'),
584
+ ('day', '1 d'),
585
+ ('hour', '1 h'),
586
+ ('minute', '1 m'),
587
+ ('second', '1 s'),
588
+ ('millisecond', '1 ms'),
589
+ ('microsecond', '1 us')
590
+ ) intervals (str, interval),
591
+ (VALUES (timestamp '0055-6-10 15:44:17.71393 BC')) ts (ts);
592
+ str | interval | equal
593
+ -------------+----------+-------
594
+ week | 7 d | t
595
+ day | 1 d | t
596
+ hour | 1 h | t
597
+ minute | 1 m | t
598
+ second | 1 s | t
599
+ millisecond | 1 ms | t
600
+ microsecond | 1 us | t
601
+ (7 rows)
602
+
603
+ -- bin timestamps into arbitrary intervals
604
+ SELECT
605
+ interval,
606
+ ts,
607
+ origin,
608
+ date_bin(interval::interval, ts, origin)
609
+ FROM (
610
+ VALUES
611
+ ('15 days'),
612
+ ('2 hours'),
613
+ ('1 hour 30 minutes'),
614
+ ('15 minutes'),
615
+ ('10 seconds'),
616
+ ('100 milliseconds'),
617
+ ('250 microseconds')
618
+ ) intervals (interval),
619
+ (VALUES (timestamp '2020-02-11 15:44:17.71393')) ts (ts),
620
+ (VALUES (timestamp '2001-01-01')) origin (origin);
621
+ interval | ts | origin | date_bin
622
+ -------------------+--------------------------------+--------------------------+--------------------------------
623
+ 15 days | Tue Feb 11 15:44:17.71393 2020 | Mon Jan 01 00:00:00 2001 | Thu Feb 06 00:00:00 2020
624
+ 2 hours | Tue Feb 11 15:44:17.71393 2020 | Mon Jan 01 00:00:00 2001 | Tue Feb 11 14:00:00 2020
625
+ 1 hour 30 minutes | Tue Feb 11 15:44:17.71393 2020 | Mon Jan 01 00:00:00 2001 | Tue Feb 11 15:00:00 2020
626
+ 15 minutes | Tue Feb 11 15:44:17.71393 2020 | Mon Jan 01 00:00:00 2001 | Tue Feb 11 15:30:00 2020
627
+ 10 seconds | Tue Feb 11 15:44:17.71393 2020 | Mon Jan 01 00:00:00 2001 | Tue Feb 11 15:44:10 2020
628
+ 100 milliseconds | Tue Feb 11 15:44:17.71393 2020 | Mon Jan 01 00:00:00 2001 | Tue Feb 11 15:44:17.7 2020
629
+ 250 microseconds | Tue Feb 11 15:44:17.71393 2020 | Mon Jan 01 00:00:00 2001 | Tue Feb 11 15:44:17.71375 2020
630
+ (7 rows)
631
+
632
+ -- shift bins using the origin parameter:
633
+ SELECT date_bin('5 min'::interval, timestamp '2020-02-01 01:01:01', timestamp '2020-02-01 00:02:30');
634
+ date_bin
635
+ --------------------------
636
+ Sat Feb 01 00:57:30 2020
637
+ (1 row)
638
+
639
+ -- disallow intervals with months or years
640
+ SELECT date_bin('5 months'::interval, timestamp '2020-02-01 01:01:01', timestamp '2001-01-01');
641
+ ERROR: timestamps cannot be binned into intervals containing months or years
642
+ SELECT date_bin('5 years'::interval, timestamp '2020-02-01 01:01:01', timestamp '2001-01-01');
643
+ ERROR: timestamps cannot be binned into intervals containing months or years
548
644
-- Test casting within a BETWEEN qualifier
549
645
SELECT d1 - timestamp without time zone '1997-01-02' AS diff
550
646
FROM TIMESTAMP_TBL
0 commit comments