Integer number in the 700000s as the days from year 1: how can this be cast in tsql to a date and back if the oldest datetime date is 1753-01-01?
4
votes
3
answers
1586
views
I fell upon an integer format for dates for which I also know the date, but I do not know how to get to that date in TSQL and I also do not know how to get to the integer if I have the date:
700444 -> 1918-10-02
731573 -> 2003-12-24
739479 -> 2025-08-16
Those 6-digit numbers would fit as a counter for each day from 0001-01-01 onwards, I checked that by getting the number of days for one century from that date that is almost year 2000 and adding that to 1900:
select DATEADD(dd,731573/20,'19000101')
Out:
2000-02-24 00:00:00.000
But I cannot run
select DATEADD(dd,731573/20,'10000101')
, which throws:
> The conversion of a varchar data type to a datetime data type resulted in an out-of-range value.
Microsoft Learn says that TSQL allows dates only from 1753-01-01 onwards, see [datetime (Transact-SQL) Microsoft Learn](https://learn.microsoft.com/en-us/sql/t-sql/data-types/datetime-transact-sql?view=sql-server-ver16#description) , thus:
select DATEADD(dd,731573/20,'17530101')
Out:
1853-02-24 00:00:00.000
I cannot add the 731573 to year 1, though. Then I found [What is the significance of 1/1/1753 in SQL Server?](https://stackoverflow.com/questions/3310569/what-is-the-significance-of-1-1-1753-in-sql-server) :
*--(as said in one of the answers and at [Why should you always write "varchar" with the length in brackets behind it? Often, you get the right outcome without doing so - DBA SE](https://dba.stackexchange.com/q/338742/212659) , take varchar(length)
instead of just varchar
)--*
SELECT CONVERT(VARCHAR, DATEADD(DAY,-731572,CAST('2003-12-24' AS DATETIME2)),100)
SELECT CONVERT(VARCHAR(30), DATEADD(DAY,-731572,CAST('2003-12-24' AS DATETIME2)),100)
Out:
Jan 1 0001 12:00AM
So that this is proven, the number *is* the days from the first day of year 0001. Now I wonder whether I can get there without formatting the datetime column as datetime2. My dates are all just in the 20th and 21st century so that I do not need the datetime2
. I get the data as datetime and try to avoid a type conversion.
How can I cast this integer in the seven-houndred-thousands as the counter of the days from the year 1 on to a date and how can I get from the date back to that integer without converting the date to datetime2?
Asked by questionto42
(366 rep)
Apr 17, 2024, 11:00 PM
Last activity: Oct 9, 2024, 08:27 PM
Last activity: Oct 9, 2024, 08:27 PM