private Expression AddMilliseconds (Expression milliseconds, Expression dateTime)
{
// Convert milliseconds value to long first (truncating).
if (milliseconds.Type != typeof (long))
milliseconds = new SqlConvertExpression (typeof (long), milliseconds);
// Add milliseconds in two steps: extract the days and add them as a "day" value, then add the remaining milliseconds as a "milliseconds" value.
// This two-step part is required because SQL Server can only add 32-bit INTs using DATEADD, no BIGINTs. The milliseconds in a day (86,400,000)
// fit into an INT. The second INT for days can express up to +/- 2^31 (or so) days, which equals about five million years. This is much
// more than a SQL DATETIME can hold.
var days = Expression.Divide (milliseconds, new SqlLiteralExpression (TimeSpan.TicksPerDay / TimeSpan.TicksPerMillisecond));
var remainingMilliseconds = Expression.Modulo (milliseconds, new SqlLiteralExpression (TimeSpan.TicksPerDay / TimeSpan.TicksPerMillisecond));
return AddUnits (remainingMilliseconds, "millisecond", AddUnits (days, "day", dateTime));
}