As mentioned in the commentary for simplicity, as it is somewhat more difficult to do without it.
Consider the following example. John was born in some place, Location1 , in January of the first 1990, but was first registered to be born on the fifth.
Persons database table now looks like this:
+----------+--------------+------------+----------+------------+----------+ | Name | Location | valid_from | valid_to | trans_from | trans_to | +----------+--------------+------------+----------+------------+----------+ | John | Location1 | 01-01-1990 |99-99-9999| 05/01/1990 |99-99-9999| +----------+--------------+------------+----------+------------+----------+
Removing the trans_to column trans_to this point will not cause too many problems, but suppose the following:
In a few years, say, 20, John move to Location2 and inform officials in 20 days. This will make the Persons table look like this:
+----------+--------------+------------+----------+------------+----------+ | Name | Location | valid_from | valid_to | trans_from | trans_to | +----------+--------------+------------+----------+------------+----------+ | John | Location1 | 01-01-1990 |99-99-9999| 05/01/1990 |20-01-2010| | John | Location1 | 01-01-1990 |01-01-2010| 20/01/2010 |99-99-9999| | John | Location2 | 01-01-2010 |99-99-9999| 20/01/2010 |99-99-9999| +----------+--------------+------------+----------+------------+----------+
Suppose someone wanted to know "Where the system thinks John is living now" (transaction time), regardless of where he actually lives. This can be (roughly) requested in SQL as follows
Select Location From Persons Where Name = John AND trans_from > NOW AND trans_to < NOW
Assume transaction completion time has been deleted
+----------+--------------+------------+----------+------------+ | Name | Location | valid_from | valid_to | trans_from | +----------+--------------+------------+----------+------------+ | John | Location1 | 01-01-1990 |99-99-9999| 05/01/1990 | | John | Location1 | 01-01-1990 |01-01-2010| 20/01/2010 | | John | Location2 | 01-01-2010 |99-99-9999| 20/01/2010 | +----------+--------------+------------+----------+------------+
The above query, of course, is no longer valid, but making the logic for the same query in the last table will be somewhat more difficult. Since trans_to absent, it must be obtained from other rows in the table. For example, the implicit trans_to time for the first line (starting from the oldest record) is trans_from from the second line, which is the newest of the two.
Thus, the transaction end time is 9999-99-99 if the line is the newest, or trans_from from the line that immediately succeeds in it.
This means that the data related to a particular line is not completely stored in this line, and the lines form a dependence on each other, which (of course) is undesirable. In addition, it is quite difficult to determine which string is the immediate successor to the string, which can make queries even more complex.