{"id":209,"date":"2012-12-24T17:48:03","date_gmt":"2012-12-24T16:48:03","guid":{"rendered":"http:\/\/www.salvis.com\/blog\/?p=209"},"modified":"2023-11-08T19:59:58","modified_gmt":"2023-11-08T18:59:58","slug":"joining-temporal-intervals","status":"publish","type":"post","link":"https:\/\/www.salvis.com\/blog\/2012\/12\/24\/joining-temporal-intervals\/","title":{"rendered":"Joining Temporal Intervals"},"content":{"rendered":"\n<p>From time to time a customer asks me how to join multiple tables with temporal intervals (e.g. defined by two columns such as valid_from and valid_to per row). The solution is quite simple if you may limit your query to a certain point in time like now, yesterday or similar. Such a time point becomes just an additional filter criterion per temporal table (e.g. t1.some_date between t2.valid_from and t2.valid_to).&nbsp;But in some cases, this approach is not feasible, e.g. if you have to provide all relevant time intervals. I&#8217;ll explain in this post a solution approach based on the following data model.<\/p>\n\n\n\n<figure class=\"wp-block-image is-style-default\"><a href=\"\/\/www.salvis.com\/blog\/wp-content\/uploads\/2012\/12\/TemporalJoinModel11.png\"><img wpfc-lazyload-disable=\"true\" loading=\"lazy\" decoding=\"async\" width=\"834\" height=\"479\" src=\"\/\/www.salvis.com\/blog\/wp-content\/uploads\/2012\/12\/TemporalJoinModel11.png\" alt=\"TemporalJoinModel\" class=\"wp-image-760\" srcset=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2012\/12\/TemporalJoinModel11.png 834w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2012\/12\/TemporalJoinModel11-300x172.png 300w\" sizes=\"auto, (max-width:767px) 480px, (max-width:834px) 100vw, 834px\" \/><\/a><\/figure>\n\n\n\n<p>This model is based on the famous EMP and DEPT tables. I added a reference table for job just to get an additional table to join. You find the SQL script to create and populate the model <a href=\"\/\/www.salvis.com\/blog\/wp-content\/uploads\/2012\/12\/00_setup_data.sql_.txt\">here<\/a>.<\/p>\n\n\n\n<p>I&#8217;d like to query data from the tables EMPV, DEPTV, JOBV and EMPV (manager). Here is the content of the tables reduced to the data relevant for empno 7788 (SCOTT).<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">Data Excerpt<\/span><span role=\"button\" tabindex=\"0\" data-code=\"SQL&gt; SELECT * FROM empv WHERE empno = 7788 ORDER BY valid_from;\n\nEMPVID EMPNO ENAME JOBNO  MGR HIREDATE     SAL COMM DEPTNO VALID_FROM  VALID_TO\n------ ----- ----- ----- ---- ----------- ---- ---- ------ ----------- -----------\n     8  7788 SCOTT     5 7566 19-APR-1987 3000          20 19-APR-1987 31-DEC-1989\n    22  7788 Scott     5 7566 19-APR-1987 3000          20 01-JAN-1990 31-MAR-1991\n    36  7788 Scott     5 7566 19-APR-1987 3300          20 01-APR-1991 31-DEC-9999\n\nSQL&gt; SELECT * FROM jobv WHERE jobno = 5 ORDER BY valid_from;\n\nJOBVID JOBNO JOB     VALID_FROM  VALID_TO\n------ ----- ------- ----------- -----------\n     5     5 ANALYST 01-JAN-1980 20-JAN-1990\n    10     5 Analyst 21-JAN-1990 31-DEC-9999\n\nSQL&gt; SELECT * FROM deptv WHERE deptno = 20 ORDER BY valid_from;\n\nDEPTVID DEPTNO DNAME    LOC    VALID_FROM  VALID_TO\n------- ------ -------- ------ ----------- -----------\n      2     20 RESEARCH DALLAS 01-JAN-1980 28-FEB-1990\n      6     20 Research DALLAS 01-MAR-1990 31-MAR-1990\n     10     20 Research Dallas 01-APR-1990 31-DEC-9999\n\nSQL&gt; SELECT * FROM empv WHERE empno = 7566 ORDER BY valid_from;\n\nEMPVID EMPNO ENAME JOBNO  MGR HIREDATE       SAL COMM DEPTNO VALID_FROM  VALID_TO\n------ ----- ----- ----- ---- ----------- ------ ---- ------ ----------- -----------\n     4  7566 JONES     4 7839 02-APR-1981   2975          20 02-APR-1981 31-DEC-1989\n    18  7566 Jones     4 7839 02-APR-1981   2975          20 01-JAN-1990 31-MAR-1991\n    32  7566 Jones     4 7839 02-APR-1981 3272.5          20 01-APR-1991 31-DEC-9999\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #569CD6\">SQL<\/span><span style=\"color: #D4D4D4\">&gt; <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> * <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> empv <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> empno = <\/span><span style=\"color: #B5CEA8\">7788<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">ORDER BY<\/span><span style=\"color: #D4D4D4\"> valid_from;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">EMPVID EMPNO ENAME JOBNO  MGR HIREDATE     SAL COMM DEPTNO VALID_FROM  VALID_TO<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">------ ----- ----- ----- ---- ----------- ---- ---- ------ ----------- -----------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">     <\/span><span style=\"color: #B5CEA8\">8<\/span><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #B5CEA8\">7788<\/span><span style=\"color: #D4D4D4\"> SCOTT     <\/span><span style=\"color: #B5CEA8\">5<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">7566<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">19<\/span><span style=\"color: #D4D4D4\">-APR-<\/span><span style=\"color: #B5CEA8\">1987<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">3000<\/span><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #B5CEA8\">20<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">19<\/span><span style=\"color: #D4D4D4\">-APR-<\/span><span style=\"color: #B5CEA8\">1987<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">31<\/span><span style=\"color: #D4D4D4\">-<\/span><span style=\"color: #569CD6\">DEC<\/span><span style=\"color: #D4D4D4\">-<\/span><span style=\"color: #B5CEA8\">1989<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #B5CEA8\">22<\/span><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #B5CEA8\">7788<\/span><span style=\"color: #D4D4D4\"> Scott     <\/span><span style=\"color: #B5CEA8\">5<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">7566<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">19<\/span><span style=\"color: #D4D4D4\">-APR-<\/span><span style=\"color: #B5CEA8\">1987<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">3000<\/span><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #B5CEA8\">20<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">01<\/span><span style=\"color: #D4D4D4\">-JAN-<\/span><span style=\"color: #B5CEA8\">1990<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">31<\/span><span style=\"color: #D4D4D4\">-MAR-<\/span><span style=\"color: #B5CEA8\">1991<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #B5CEA8\">36<\/span><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #B5CEA8\">7788<\/span><span style=\"color: #D4D4D4\"> Scott     <\/span><span style=\"color: #B5CEA8\">5<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">7566<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">19<\/span><span style=\"color: #D4D4D4\">-APR-<\/span><span style=\"color: #B5CEA8\">1987<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">3300<\/span><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #B5CEA8\">20<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">01<\/span><span style=\"color: #D4D4D4\">-APR-<\/span><span style=\"color: #B5CEA8\">1991<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">31<\/span><span style=\"color: #D4D4D4\">-<\/span><span style=\"color: #569CD6\">DEC<\/span><span style=\"color: #D4D4D4\">-<\/span><span style=\"color: #B5CEA8\">9999<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">SQL<\/span><span style=\"color: #D4D4D4\">&gt; <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> * <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> jobv <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> jobno = <\/span><span style=\"color: #B5CEA8\">5<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">ORDER BY<\/span><span style=\"color: #D4D4D4\"> valid_from;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">JOBVID JOBNO JOB     VALID_FROM  VALID_TO<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">------ ----- ------- ----------- -----------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">     <\/span><span style=\"color: #B5CEA8\">5<\/span><span style=\"color: #D4D4D4\">     <\/span><span style=\"color: #B5CEA8\">5<\/span><span style=\"color: #D4D4D4\"> ANALYST <\/span><span style=\"color: #B5CEA8\">01<\/span><span style=\"color: #D4D4D4\">-JAN-<\/span><span style=\"color: #B5CEA8\">1980<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">20<\/span><span style=\"color: #D4D4D4\">-JAN-<\/span><span style=\"color: #B5CEA8\">1990<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #B5CEA8\">10<\/span><span style=\"color: #D4D4D4\">     <\/span><span style=\"color: #B5CEA8\">5<\/span><span style=\"color: #D4D4D4\"> Analyst <\/span><span style=\"color: #B5CEA8\">21<\/span><span style=\"color: #D4D4D4\">-JAN-<\/span><span style=\"color: #B5CEA8\">1990<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">31<\/span><span style=\"color: #D4D4D4\">-<\/span><span style=\"color: #569CD6\">DEC<\/span><span style=\"color: #D4D4D4\">-<\/span><span style=\"color: #B5CEA8\">9999<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">SQL<\/span><span style=\"color: #D4D4D4\">&gt; <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> * <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> deptv <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> deptno = <\/span><span style=\"color: #B5CEA8\">20<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">ORDER BY<\/span><span style=\"color: #D4D4D4\"> valid_from;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">DEPTVID DEPTNO DNAME    LOC    VALID_FROM  VALID_TO<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">------- ------ -------- ------ ----------- -----------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #B5CEA8\">2<\/span><span style=\"color: #D4D4D4\">     <\/span><span style=\"color: #B5CEA8\">20<\/span><span style=\"color: #D4D4D4\"> RESEARCH DALLAS <\/span><span style=\"color: #B5CEA8\">01<\/span><span style=\"color: #D4D4D4\">-JAN-<\/span><span style=\"color: #B5CEA8\">1980<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">28<\/span><span style=\"color: #D4D4D4\">-FEB-<\/span><span style=\"color: #B5CEA8\">1990<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #B5CEA8\">6<\/span><span style=\"color: #D4D4D4\">     <\/span><span style=\"color: #B5CEA8\">20<\/span><span style=\"color: #D4D4D4\"> Research DALLAS <\/span><span style=\"color: #B5CEA8\">01<\/span><span style=\"color: #D4D4D4\">-MAR-<\/span><span style=\"color: #B5CEA8\">1990<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">31<\/span><span style=\"color: #D4D4D4\">-MAR-<\/span><span style=\"color: #B5CEA8\">1990<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">     <\/span><span style=\"color: #B5CEA8\">10<\/span><span style=\"color: #D4D4D4\">     <\/span><span style=\"color: #B5CEA8\">20<\/span><span style=\"color: #D4D4D4\"> Research Dallas <\/span><span style=\"color: #B5CEA8\">01<\/span><span style=\"color: #D4D4D4\">-APR-<\/span><span style=\"color: #B5CEA8\">1990<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">31<\/span><span style=\"color: #D4D4D4\">-<\/span><span style=\"color: #569CD6\">DEC<\/span><span style=\"color: #D4D4D4\">-<\/span><span style=\"color: #B5CEA8\">9999<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">SQL<\/span><span style=\"color: #D4D4D4\">&gt; <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> * <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> empv <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> empno = <\/span><span style=\"color: #B5CEA8\">7566<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">ORDER BY<\/span><span style=\"color: #D4D4D4\"> valid_from;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">EMPVID EMPNO ENAME JOBNO  MGR HIREDATE       SAL COMM DEPTNO VALID_FROM  VALID_TO<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">------ ----- ----- ----- ---- ----------- ------ ---- ------ ----------- -----------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">     <\/span><span style=\"color: #B5CEA8\">4<\/span><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #B5CEA8\">7566<\/span><span style=\"color: #D4D4D4\"> JONES     <\/span><span style=\"color: #B5CEA8\">4<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">7839<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">02<\/span><span style=\"color: #D4D4D4\">-APR-<\/span><span style=\"color: #B5CEA8\">1981<\/span><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #B5CEA8\">2975<\/span><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #B5CEA8\">20<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">02<\/span><span style=\"color: #D4D4D4\">-APR-<\/span><span style=\"color: #B5CEA8\">1981<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">31<\/span><span style=\"color: #D4D4D4\">-<\/span><span style=\"color: #569CD6\">DEC<\/span><span style=\"color: #D4D4D4\">-<\/span><span style=\"color: #B5CEA8\">1989<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #B5CEA8\">18<\/span><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #B5CEA8\">7566<\/span><span style=\"color: #D4D4D4\"> Jones     <\/span><span style=\"color: #B5CEA8\">4<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">7839<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">02<\/span><span style=\"color: #D4D4D4\">-APR-<\/span><span style=\"color: #B5CEA8\">1981<\/span><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #B5CEA8\">2975<\/span><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #B5CEA8\">20<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">01<\/span><span style=\"color: #D4D4D4\">-JAN-<\/span><span style=\"color: #B5CEA8\">1990<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">31<\/span><span style=\"color: #D4D4D4\">-MAR-<\/span><span style=\"color: #B5CEA8\">1991<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #B5CEA8\">32<\/span><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #B5CEA8\">7566<\/span><span style=\"color: #D4D4D4\"> Jones     <\/span><span style=\"color: #B5CEA8\">4<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">7839<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">02<\/span><span style=\"color: #D4D4D4\">-APR-<\/span><span style=\"color: #B5CEA8\">1981<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">3272<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #B5CEA8\">5<\/span><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #B5CEA8\">20<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">01<\/span><span style=\"color: #D4D4D4\">-APR-<\/span><span style=\"color: #B5CEA8\">1991<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">31<\/span><span style=\"color: #D4D4D4\">-<\/span><span style=\"color: #569CD6\">DEC<\/span><span style=\"color: #D4D4D4\">-<\/span><span style=\"color: #B5CEA8\">9999<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>The following figure visualizes the expected result of a temporal join using the data queried previously.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"\/\/www.salvis.com\/blog\/wp-content\/uploads\/2012\/12\/TemporalJoinOverview1.png\"><img wpfc-lazyload-disable=\"true\" loading=\"lazy\" decoding=\"async\" width=\"746\" height=\"408\" src=\"\/\/www.salvis.com\/blog\/wp-content\/uploads\/2012\/12\/TemporalJoinOverview1.png\" alt=\"TemporalJoinOverview\" class=\"wp-image-762\" srcset=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2012\/12\/TemporalJoinOverview1.png 746w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2012\/12\/TemporalJoinOverview1-300x164.png 300w\" sizes=\"auto, (max-width:767px) 480px, 746px\" \/><\/a><\/figure>\n\n\n\n<p>In this case, six result records (intervals) are expected. As you see the result is dependent on the number of different intervals or the distinct VALID_FROM values. The driving object is valid from 19-APR-1987 until 31-DEC-9999. VALID_FROM values outside of the validity are irrelevant (e.g. 01-JAN-1980 and 02-APR-1981).<\/p>\n\n\n\n<p>Based on this information we can write the query. The highlighted inline view g produces a list of all distinct VALID_FROM values which will be used as additional join criterion for all temporal tables.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(234, 191, 191, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">Temporal Query (including semantic, no gaps)<\/span><span role=\"button\" tabindex=\"0\" data-code=\"SELECT e.empno,\n       MIN(g.valid_from) AS valid_from,\n       LEAD(MIN(g.valid_from) - 1, 1, DATE '9999-12-31') OVER(\n          PARTITION BY e.empno ORDER BY MIN(g.valid_from)\n       ) AS valid_to,\n       e.ename,\n       j.job,\n       e.mgr,\n       m.ename AS mgr_ename,\n       e.hiredate,\n       e.sal,\n       e.comm,\n       e.deptno,\n       d.dname,\n       d.loc\n  FROM empv e\n INNER JOIN (SELECT valid_from FROM empv\n             UNION\n             SELECT valid_from FROM deptv\n             UNION\n             SELECT valid_from FROM jobv) g\n    ON g.valid_from BETWEEN e.valid_from AND e.valid_to\n INNER JOIN deptv d\n    ON d.deptno = e.deptno\n       AND g.valid_from BETWEEN d.valid_from AND d.valid_to\n INNER JOIN jobv j\n    ON j.jobno = e.jobno\n       AND g.valid_from BETWEEN j.valid_from AND j.valid_to\n  LEFT JOIN empv m\n    ON m.empno = e.mgr\n       AND g.valid_from BETWEEN m.valid_from AND m.valid_to\n WHERE e.empno = 7788\n GROUP BY e.empno,\n          e.ename,\n          j.job,\n          e.mgr,\n          m.ename,\n          e.hiredate,\n          e.sal,\n          e.comm,\n          e.deptno,\n          d.dname,\n          d.loc\n ORDER BY empno, valid_from;\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> e.empno,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #DCDCAA\">MIN<\/span><span style=\"color: #D4D4D4\">(g.valid_from) <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> valid_from,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #DCDCAA\">LEAD<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #DCDCAA\">MIN<\/span><span style=\"color: #D4D4D4\">(g.valid_from) - <\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">DATE<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&#39;9999-12-31&#39;<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #569CD6\">OVER<\/span><span style=\"color: #D4D4D4\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #569CD6\">PARTITION<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">BY<\/span><span style=\"color: #D4D4D4\"> e.empno <\/span><span style=\"color: #569CD6\">ORDER BY<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">MIN<\/span><span style=\"color: #D4D4D4\">(g.valid_from)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       ) <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> valid_to,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       e.ename,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       j.job,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       e.mgr,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       m.ename <\/span><span style=\"color: #569CD6\">AS<\/span><span style=\"color: #D4D4D4\"> mgr_ename,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       e.hiredate,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       e.sal,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       e.comm,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       e.deptno,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       d.dname,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       d.loc<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> empv e<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">INNER JOIN<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> valid_from <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> empv<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #569CD6\">UNION<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> valid_from <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> deptv<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #569CD6\">UNION<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #D4D4D4\">             <\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> valid_from <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> jobv) g<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">ON<\/span><span style=\"color: #D4D4D4\"> g.valid_from <\/span><span style=\"color: #569CD6\">BETWEEN<\/span><span style=\"color: #D4D4D4\"> e.valid_from <\/span><span style=\"color: #569CD6\">AND<\/span><span style=\"color: #D4D4D4\"> e.valid_to<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">INNER JOIN<\/span><span style=\"color: #D4D4D4\"> deptv d<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">ON<\/span><span style=\"color: #D4D4D4\"> d.deptno = e.deptno<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #569CD6\">AND<\/span><span style=\"color: #D4D4D4\"> g.valid_from <\/span><span style=\"color: #569CD6\">BETWEEN<\/span><span style=\"color: #D4D4D4\"> d.valid_from <\/span><span style=\"color: #569CD6\">AND<\/span><span style=\"color: #D4D4D4\"> d.valid_to<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">INNER JOIN<\/span><span style=\"color: #D4D4D4\"> jobv j<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">ON<\/span><span style=\"color: #D4D4D4\"> j.jobno = e.jobno<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #569CD6\">AND<\/span><span style=\"color: #D4D4D4\"> g.valid_from <\/span><span style=\"color: #569CD6\">BETWEEN<\/span><span style=\"color: #D4D4D4\"> j.valid_from <\/span><span style=\"color: #569CD6\">AND<\/span><span style=\"color: #D4D4D4\"> j.valid_to<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">LEFT JOIN<\/span><span style=\"color: #D4D4D4\"> empv m<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">ON<\/span><span style=\"color: #D4D4D4\"> m.empno = e.mgr<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       <\/span><span style=\"color: #569CD6\">AND<\/span><span style=\"color: #D4D4D4\"> g.valid_from <\/span><span style=\"color: #569CD6\">BETWEEN<\/span><span style=\"color: #D4D4D4\"> m.valid_from <\/span><span style=\"color: #569CD6\">AND<\/span><span style=\"color: #D4D4D4\"> m.valid_to<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> e.empno = <\/span><span style=\"color: #B5CEA8\">7788<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">GROUP BY<\/span><span style=\"color: #D4D4D4\"> e.empno,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          e.ename,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          j.job,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          e.mgr,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          m.ename,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          e.hiredate,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          e.sal,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          e.comm,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          e.deptno,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          d.dname,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          d.loc<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">ORDER BY<\/span><span style=\"color: #D4D4D4\"> empno, valid_from;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">Query Result<\/span><span role=\"button\" tabindex=\"0\" data-code=\"EMPNO VALID_FROM  VALID_TO    ENAME JOB      MGR MGR_ENAME HIREDATE     SAL COMM DEPTNO DNAME    LOC\n----- ----------- ----------- ----- ------- ---- --------- ----------- ---- ---- ------ -------- ------\n 7788 19-APR-1987 31-DEC-1989 SCOTT ANALYST 7566 JONES     19-APR-1987 3000          20 RESEARCH DALLAS\n 7788 01-JAN-1990 20-JAN-1990 Scott ANALYST 7566 Jones     19-APR-1987 3000          20 RESEARCH DALLAS\n 7788 21-JAN-1990 28-FEB-1990 Scott Analyst 7566 Jones     19-APR-1987 3000          20 RESEARCH DALLAS\n 7788 01-MAR-1990 31-MAR-1990 Scott Analyst 7566 Jones     19-APR-1987 3000          20 Research DALLAS\n 7788 01-APR-1990 31-MAR-1991 Scott Analyst 7566 Jones     19-APR-1987 3000          20 Research Dallas\n 7788 01-APR-1991 31-DEC-9999 Scott Analyst 7566 Jones     19-APR-1987 3300          20 Research Dallas\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D4D4D4\">EMPNO VALID_FROM  VALID_TO    ENAME JOB      MGR MGR_ENAME HIREDATE     SAL COMM DEPTNO DNAME    LOC<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">----- ----------- ----------- ----- ------- ---- --------- ----------- ---- ---- ------ -------- ------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> 7788 19-APR-1987 31-DEC-1989 SCOTT ANALYST 7566 JONES     19-APR-1987 3000          20 RESEARCH DALLAS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> 7788 01-JAN-1990 20-JAN-1990 Scott ANALYST 7566 Jones     19-APR-1987 3000          20 RESEARCH DALLAS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> 7788 21-JAN-1990 28-FEB-1990 Scott Analyst 7566 Jones     19-APR-1987 3000          20 RESEARCH DALLAS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> 7788 01-MAR-1990 31-MAR-1990 Scott Analyst 7566 Jones     19-APR-1987 3000          20 Research DALLAS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> 7788 01-APR-1990 31-MAR-1991 Scott Analyst 7566 Jones     19-APR-1987 3000          20 Research Dallas<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"> 7788 01-APR-1991 31-DEC-9999 Scott Analyst 7566 Jones     19-APR-1987 3300          20 Research Dallas<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>The beauty of this approach is that it works with any granularity and it automatically merges identical intervals. In this example, I use a granularity of a day, but this approach works also for the granularity of seconds or even a fraction of a second, e.g. if you are using a TIMESTAMP data type to define the interval boundaries.<\/p>\n\n\n\n<p>It&#8217;s important to notice that I&#8217;ve used an including semantic for VALID_TO in this example. If you use an excluding semantic (VALID_TO = VALID_FROM of the subsequent interval) you have to amend the calculation of the VALID_TO and the join criteria (BETWEEN is not feasible with excluding semantic). Furthermore, this example does not cover gaps in the historization. If you have gaps you need to amend the calculation of the VALID_TO column and ensure that you do not merge gaps. Merging intervals with a simple group by will produce wrong results if &#8220;disconnected&#8221; intervals have the same content. Issues are addressed in <a title=\"Joining Temporal Intervals Part 2\" href=\"\/\/www.salvis.com\/blog\/2012\/12\/28\/joining-temporal-intervals-part-2\/\">part 2<\/a> of this post.<\/p>\n\n\n\n<p><em>Updated on 2012-12-28, emphasized the <\/em>possibility of wrong results and added a <em>link to <a title=\"Joining Temporal Intervals Part 2\" href=\"\/\/www.salvis.com\/blog\/2012\/12\/28\/joining-temporal-intervals-part-2\/\">part 2<\/a> of this post.<br \/><\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>From time to time a customer asks me how to join multiple tables with temporal intervals (e.g. defined by two columns such as valid_from and valid_to per row). The solution is quite simple if you may limit your query to a certain point in time like now, yesterday or similar. Such a<span class=\"excerpt-hellip\"> [\u2026]<\/span><\/p>\n","protected":false},"author":1,"featured_media":762,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[42,43],"class_list":["post-209","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-oracle","tag-temporal-database","tag-valid-time"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Joining Temporal Intervals - Philipp Salvisberg&#039;s Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.salvis.com\/blog\/2012\/12\/24\/joining-temporal-intervals\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Joining Temporal Intervals - Philipp Salvisberg&#039;s Blog\" \/>\n<meta property=\"og:description\" content=\"From time to time a customer asks me how to join multiple tables with temporal intervals (e.g. defined by two columns such as valid_from and valid_to per row). The solution is quite simple if you may limit your query to a certain point in time like now, yesterday or similar. Such a [\u2026]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.salvis.com\/blog\/2012\/12\/24\/joining-temporal-intervals\/\" \/>\n<meta property=\"og:site_name\" content=\"Philipp Salvisberg&#039;s Blog\" \/>\n<meta property=\"article:published_time\" content=\"2012-12-24T16:48:03+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-11-08T18:59:58+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2012\/12\/TemporalJoinOverview1.png\" \/>\n\t<meta property=\"og:image:width\" content=\"746\" \/>\n\t<meta property=\"og:image:height\" content=\"408\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Philipp Salvisberg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@phsalvisberg\" \/>\n<meta name=\"twitter:site\" content=\"@phsalvisberg\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Philipp Salvisberg\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2012\\\/12\\\/24\\\/joining-temporal-intervals\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2012\\\/12\\\/24\\\/joining-temporal-intervals\\\/\"},\"author\":{\"name\":\"Philipp Salvisberg\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/#\\\/schema\\\/person\\\/34352245c48678b1a5a05d4bc1339515\"},\"headline\":\"Joining Temporal Intervals\",\"datePublished\":\"2012-12-24T16:48:03+00:00\",\"dateModified\":\"2023-11-08T18:59:58+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2012\\\/12\\\/24\\\/joining-temporal-intervals\\\/\"},\"wordCount\":489,\"commentCount\":1,\"publisher\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/#\\\/schema\\\/person\\\/34352245c48678b1a5a05d4bc1339515\"},\"image\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2012\\\/12\\\/24\\\/joining-temporal-intervals\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2012\\\/12\\\/TemporalJoinOverview1.png\",\"keywords\":[\"Temporal Database\",\"Valid Time\"],\"articleSection\":[\"Oracle\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2012\\\/12\\\/24\\\/joining-temporal-intervals\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2012\\\/12\\\/24\\\/joining-temporal-intervals\\\/\",\"url\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2012\\\/12\\\/24\\\/joining-temporal-intervals\\\/\",\"name\":\"Joining Temporal Intervals - Philipp Salvisberg&#039;s Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2012\\\/12\\\/24\\\/joining-temporal-intervals\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2012\\\/12\\\/24\\\/joining-temporal-intervals\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2012\\\/12\\\/TemporalJoinOverview1.png\",\"datePublished\":\"2012-12-24T16:48:03+00:00\",\"dateModified\":\"2023-11-08T18:59:58+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2012\\\/12\\\/24\\\/joining-temporal-intervals\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2012\\\/12\\\/24\\\/joining-temporal-intervals\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2012\\\/12\\\/24\\\/joining-temporal-intervals\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2012\\\/12\\\/TemporalJoinOverview1.png\",\"contentUrl\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2012\\\/12\\\/TemporalJoinOverview1.png\",\"width\":746,\"height\":408},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2012\\\/12\\\/24\\\/joining-temporal-intervals\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Joining Temporal Intervals\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/\",\"name\":\"Philipp Salvisberg&#039;s Blog\",\"description\":\"Database-centric development\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/#\\\/schema\\\/person\\\/34352245c48678b1a5a05d4bc1339515\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/#\\\/schema\\\/person\\\/34352245c48678b1a5a05d4bc1339515\",\"name\":\"Philipp Salvisberg\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2010\\\/11\\\/phs_trivadis4.jpg\",\"url\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2010\\\/11\\\/phs_trivadis4.jpg\",\"contentUrl\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2010\\\/11\\\/phs_trivadis4.jpg\",\"width\":400,\"height\":400,\"caption\":\"Philipp Salvisberg\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2010\\\/11\\\/phs_trivadis4.jpg\"},\"sameAs\":[\"http:\\\/\\\/www.salvis.com\\\/\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Joining Temporal Intervals - Philipp Salvisberg&#039;s Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.salvis.com\/blog\/2012\/12\/24\/joining-temporal-intervals\/","og_locale":"en_US","og_type":"article","og_title":"Joining Temporal Intervals - Philipp Salvisberg&#039;s Blog","og_description":"From time to time a customer asks me how to join multiple tables with temporal intervals (e.g. defined by two columns such as valid_from and valid_to per row). The solution is quite simple if you may limit your query to a certain point in time like now, yesterday or similar. Such a [\u2026]","og_url":"https:\/\/www.salvis.com\/blog\/2012\/12\/24\/joining-temporal-intervals\/","og_site_name":"Philipp Salvisberg&#039;s Blog","article_published_time":"2012-12-24T16:48:03+00:00","article_modified_time":"2023-11-08T18:59:58+00:00","og_image":[{"width":746,"height":408,"url":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2012\/12\/TemporalJoinOverview1.png","type":"image\/png"}],"author":"Philipp Salvisberg","twitter_card":"summary_large_image","twitter_creator":"@phsalvisberg","twitter_site":"@phsalvisberg","twitter_misc":{"Written by":"Philipp Salvisberg","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.salvis.com\/blog\/2012\/12\/24\/joining-temporal-intervals\/#article","isPartOf":{"@id":"https:\/\/www.salvis.com\/blog\/2012\/12\/24\/joining-temporal-intervals\/"},"author":{"name":"Philipp Salvisberg","@id":"https:\/\/www.salvis.com\/blog\/#\/schema\/person\/34352245c48678b1a5a05d4bc1339515"},"headline":"Joining Temporal Intervals","datePublished":"2012-12-24T16:48:03+00:00","dateModified":"2023-11-08T18:59:58+00:00","mainEntityOfPage":{"@id":"https:\/\/www.salvis.com\/blog\/2012\/12\/24\/joining-temporal-intervals\/"},"wordCount":489,"commentCount":1,"publisher":{"@id":"https:\/\/www.salvis.com\/blog\/#\/schema\/person\/34352245c48678b1a5a05d4bc1339515"},"image":{"@id":"https:\/\/www.salvis.com\/blog\/2012\/12\/24\/joining-temporal-intervals\/#primaryimage"},"thumbnailUrl":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2012\/12\/TemporalJoinOverview1.png","keywords":["Temporal Database","Valid Time"],"articleSection":["Oracle"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.salvis.com\/blog\/2012\/12\/24\/joining-temporal-intervals\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.salvis.com\/blog\/2012\/12\/24\/joining-temporal-intervals\/","url":"https:\/\/www.salvis.com\/blog\/2012\/12\/24\/joining-temporal-intervals\/","name":"Joining Temporal Intervals - Philipp Salvisberg&#039;s Blog","isPartOf":{"@id":"https:\/\/www.salvis.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.salvis.com\/blog\/2012\/12\/24\/joining-temporal-intervals\/#primaryimage"},"image":{"@id":"https:\/\/www.salvis.com\/blog\/2012\/12\/24\/joining-temporal-intervals\/#primaryimage"},"thumbnailUrl":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2012\/12\/TemporalJoinOverview1.png","datePublished":"2012-12-24T16:48:03+00:00","dateModified":"2023-11-08T18:59:58+00:00","breadcrumb":{"@id":"https:\/\/www.salvis.com\/blog\/2012\/12\/24\/joining-temporal-intervals\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.salvis.com\/blog\/2012\/12\/24\/joining-temporal-intervals\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.salvis.com\/blog\/2012\/12\/24\/joining-temporal-intervals\/#primaryimage","url":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2012\/12\/TemporalJoinOverview1.png","contentUrl":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2012\/12\/TemporalJoinOverview1.png","width":746,"height":408},{"@type":"BreadcrumbList","@id":"https:\/\/www.salvis.com\/blog\/2012\/12\/24\/joining-temporal-intervals\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.salvis.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Joining Temporal Intervals"}]},{"@type":"WebSite","@id":"https:\/\/www.salvis.com\/blog\/#website","url":"https:\/\/www.salvis.com\/blog\/","name":"Philipp Salvisberg&#039;s Blog","description":"Database-centric development","publisher":{"@id":"https:\/\/www.salvis.com\/blog\/#\/schema\/person\/34352245c48678b1a5a05d4bc1339515"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.salvis.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.salvis.com\/blog\/#\/schema\/person\/34352245c48678b1a5a05d4bc1339515","name":"Philipp Salvisberg","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2010\/11\/phs_trivadis4.jpg","url":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2010\/11\/phs_trivadis4.jpg","contentUrl":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2010\/11\/phs_trivadis4.jpg","width":400,"height":400,"caption":"Philipp Salvisberg"},"logo":{"@id":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2010\/11\/phs_trivadis4.jpg"},"sameAs":["http:\/\/www.salvis.com\/"]}]}},"_links":{"self":[{"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/posts\/209","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/comments?post=209"}],"version-history":[{"count":11,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/posts\/209\/revisions"}],"predecessor-version":[{"id":12744,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/posts\/209\/revisions\/12744"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/media\/762"}],"wp:attachment":[{"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/media?parent=209"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/categories?post=209"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/tags?post=209"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}