public static void Main()
DateTime start = new DateTime(2015, 2, 19);
DateTime end = new DateTime(2016, 2, 19);
Console.WriteLine(GenerateDateRangeClause(start, end));
public static string GenerateDateRangeClause(DateTime date1, DateTime date2)
StringBuilder whereClause = new StringBuilder();
if (date1.Year != date2.Year)
whereClause.AppendFormat("(Day IS NOT NULL AND (");
whereClause.AppendFormat("(Month = {0} AND Day >= {1} AND Year = {2})", date1.Month, date1.Day, date1.Year);
whereClause.Append(" OR ");
whereClause.AppendFormat("(Month > {0} AND Year = {1})", date1.Month, date1.Year);
whereClause.Append(" OR ");
whereClause.AppendFormat("(Year > {0} AND Year < {1})", date1.Year, date2.Year);
whereClause.Append(" OR ");
whereClause.AppendFormat("(Month = {0} AND Day <= {1} AND Year = {2})", date2.Month, date2.Day, date2.Year);
whereClause.Append(" OR ");
whereClause.AppendFormat("(Month < {0} AND Year = {2})", date2.Month, date2.Day, date2.Year);
whereClause.Append("))");
else if (date1.Month != date2.Month)
whereClause.AppendFormat("(Day IS NOT NULL AND Year = {0} AND (", date1.Year);
whereClause.AppendFormat("(Month = {0} AND Day >= {1})", date1.Month, date1.Day);
whereClause.Append(" OR ");
whereClause.AppendFormat("(Month > {0} AND Month < {1})", date1.Month, date2.Month);
whereClause.Append(" OR ");
whereClause.AppendFormat("(Month = {0} AND Day <= {1})", date2.Month, date2.Day);
whereClause.Append("))");
whereClause.AppendFormat("(Day IS NOT NULL AND Year = {0} AND Month = {1} AND Day BETWEEN {2} AND {3})", date1.Year, date1.Month, date1.Day, date2.Day);
return whereClause.ToString();