SQL Server vs .NET DateTime Leap Year Arithmetic
I recently refactored some code that was performing date arithmetic in SQL Server. The code was attempting to retrieve the "same day next year" by adding 365 days to the date provided. I was refactoring this logic out of SQL Server and in to .NET, and I was concerned that .NET's DateTime arithmetic wouldn't match SQL Server. I was pleasantly surprised that the results were the same. However, I should call out that perhaps in your situation adding 365 days to a given date is not appropriate for getting the "same day next year" value. I also compared this logic when preforming a "Add years + 1" and the results were also the same. (However, to be clear, adding 365 days differed from adding 1 year, but both SQL and .NET preformed the same given the method used.)
source code: https://gist.github.com/aaronhoffman/3d997390dab7f69e6597
results table:
Hope this helps,
Aaron
source code: https://gist.github.com/aaronhoffman/3d997390dab7f69e6597
results table:
Method | Value | StartDate | .NET Result | SQL Result | |
AddDays | 365 | 2/27/2011 | 2/27/2012 | 2/27/2012 | |
AddYears | 1 | 2/27/2011 | 2/27/2012 | 2/27/2012 | |
AddDays | 365 | 2/28/2011 | 2/28/2012 | 2/28/2012 | |
AddYears | 1 | 2/28/2011 | 2/28/2012 | 2/28/2012 | |
AddDays | 365 | 3/1/2011 | 2/29/2012 | 2/29/2012 | |
AddYears | 1 | 3/1/2011 | 3/1/2012 | 3/1/2012 | |
AddDays | -365 | 2/27/2012 | 2/27/2011 | 2/27/2011 | |
AddYears | -1 | 2/27/2012 | 2/27/2011 | 2/27/2011 | |
AddDays | 365 | 2/27/2012 | 2/26/2013 | 2/26/2013 | |
AddYears | 1 | 2/27/2012 | 2/27/2013 | 2/27/2013 | |
AddDays | -365 | 2/28/2012 | 2/28/2011 | 2/28/2011 | |
AddYears | -1 | 2/28/2012 | 2/28/2011 | 2/28/2011 | |
AddDays | 365 | 2/28/2012 | 2/27/2013 | 2/27/2013 | |
AddYears | 1 | 2/28/2012 | 2/28/2013 | 2/28/2013 | |
AddDays | -365 | 2/29/2012 | 3/1/2011 | 3/1/2011 | |
AddYears | -1 | 2/29/2012 | 2/28/2011 | 2/28/2011 | |
AddDays | 365 | 2/29/2012 | 2/28/2013 | 2/28/2013 | |
AddYears | 1 | 2/29/2012 | 2/28/2013 | 2/28/2013 | |
AddDays | -365 | 3/1/2012 | 3/2/2011 | 3/2/2011 | |
AddYears | -1 | 3/1/2012 | 3/1/2011 | 3/1/2011 | |
AddDays | 365 | 3/1/2012 | 3/1/2013 | 3/1/2013 | |
AddYears | 1 | 3/1/2012 | 3/1/2013 | 3/1/2013 | |
AddDays | -365 | 2/27/2013 | 2/28/2012 | 2/28/2012 | |
AddYears | -1 | 2/27/2013 | 2/27/2012 | 2/27/2012 | |
AddDays | -365 | 2/28/2013 | 2/29/2012 | 2/29/2012 | |
AddYears | -1 | 2/28/2013 | 2/28/2012 | 2/28/2012 | |
AddDays | -365 | 3/1/2013 | 3/1/2012 | 3/1/2012 | |
AddYears | -1 | 3/1/2013 | 3/1/2012 | 3/1/2012 |
Hope this helps,
Aaron
Comments