This commit is contained in:
2020-02-08 00:12:32 +00:00
parent 9c85b6c462
commit f91ed7dc23
2 changed files with 112 additions and 484 deletions

View File

@@ -1,69 +1,69 @@
namespace AyaNova.DataList
{
public static class DataListFilterSpecialToken
{
public const string Null = "{[null]}";
public const string Yesterday = "{[yesterday]}";
public const string Today = "{[today]}";
public const string Tomorrow = "{[tomorrow]}";
public const string LastWeek = "{[lastweek]}";
public const string ThisWeek = "{[thisweek]}";
public const string NextWeek = "{[nextweek]}";
public const string LastMonth = "{[lastmonth]}";
public const string ThisMonth = "{[thismonth]}";
public const string NextMonth = "{[nextmonth]}";
public const string FourteenDayWindow = "{[14daywindow]}";
public const string Past = "{[past]}";
public const string Future = "{[future]}";
public const string LastYear = "{[lastyear]}";
public const string ThisYear = "{[thisyear]}";
public const string InTheLast3Months = "{[last3months]}";
public const string InTheLast6Months = "{[last6months]}";
public const string InTheLastYear = "{[lastcalendaryear]}";
// namespace AyaNova.DataList
// {
// public static class DataListFilterSpecialToken
// {
// public const string Null = "{[null]}";
// public const string Yesterday = "{[yesterday]}";
// public const string Today = "{[today]}";
// public const string Tomorrow = "{[tomorrow]}";
// public const string LastWeek = "{[lastweek]}";
// public const string ThisWeek = "{[thisweek]}";
// public const string NextWeek = "{[nextweek]}";
// public const string LastMonth = "{[lastmonth]}";
// public const string ThisMonth = "{[thismonth]}";
// public const string NextMonth = "{[nextmonth]}";
// public const string FourteenDayWindow = "{[14daywindow]}";
// public const string Past = "{[past]}";
// public const string Future = "{[future]}";
// public const string LastYear = "{[lastyear]}";
// public const string ThisYear = "{[thisyear]}";
// public const string InTheLast3Months = "{[last3months]}";
// public const string InTheLast6Months = "{[last6months]}";
// public const string InTheLastYear = "{[lastcalendaryear]}";
//Months THIS year
public const string January = "{[january]}";
public const string February = "{[february]}";
public const string March = "{[march]}";
public const string April = "{[april]}";
public const string May = "{[may]}";
public const string June = "{[june]}";
public const string July = "{[july]}";
public const string August = "{[august]}";
public const string September = "{[september]}";
public const string October = "{[october]}";
public const string November = "{[november]}";
public const string December = "{[december]}";
// //Months THIS year
// public const string January = "{[january]}";
// public const string February = "{[february]}";
// public const string March = "{[march]}";
// public const string April = "{[april]}";
// public const string May = "{[may]}";
// public const string June = "{[june]}";
// public const string July = "{[july]}";
// public const string August = "{[august]}";
// public const string September = "{[september]}";
// public const string October = "{[october]}";
// public const string November = "{[november]}";
// public const string December = "{[december]}";
//These TEXT filter tokens were more for paging purposes than anything else
//however paging is done by numeric range now so will not implement for now
// public const string AH = "{[ah]}";
// public const string IP = "{[ip]}";
// public const string QZ = "{[qz]}";
// public const string ZeroToThree = "{[03]}";
// public const string FourToSix = "{[46]}";
// public const string SevenToNine = "{[79]}";
// //These TEXT filter tokens were more for paging purposes than anything else
// //however paging is done by numeric range now so will not implement for now
// // public const string AH = "{[ah]}";
// // public const string IP = "{[ip]}";
// // public const string QZ = "{[qz]}";
// // public const string ZeroToThree = "{[03]}";
// // public const string FourToSix = "{[46]}";
// // public const string SevenToNine = "{[79]}";
//Don't think I need these
//public const string LessThanZero = "{[<0]}";
// public const string Zero = "{[0]}";
//public const string GreaterThanZero = "{[>0]}";
// //Don't think I need these
// //public const string LessThanZero = "{[<0]}";
// // public const string Zero = "{[0]}";
// //public const string GreaterThanZero = "{[>0]}";
//https://www.klipfolio.com/resources/articles/kpi-timeframe-comparison-metrics
// //https://www.klipfolio.com/resources/articles/kpi-timeframe-comparison-metrics
//More business time frames
// //More business time frames
public const string YearToDate = "{[yeartodate]}";
// public const string YearToDate = "{[yeartodate]}";
public const string Past90Days = "{[past90days]}";
public const string Past30Days = "{[past30days]}";
public const string Past24Hours = "{[past24hours]}";
// public const string Past90Days = "{[past90days]}";
// public const string Past30Days = "{[past30days]}";
// public const string Past24Hours = "{[past24hours]}";
}
}
// }
// }

View File

@@ -74,7 +74,7 @@ namespace AyaNova.DataList
sb.Append(" ");
//handle null values separately
if (!TagFilter && sValue == DataListFilterSpecialToken.Null)
if (!TagFilter && sValue == "{[null]}")
{
switch (DataType)
{
@@ -290,440 +290,68 @@ namespace AyaNova.DataList
//suitable for the database to handle as all database dates are in UTC
//Local display and parsing will be considered a CLIENT issue at all times
//HOWEVER, if it's a relative date filter TOKEN like "nextMonth" then the users time zone offset will be taken into consideration
#region Build criteria for date specified
//RAVEN NOTE: it is my intention that dates come in iso8601 UTC format from the client
//so a simple parse should be sufficient
//https://docs.microsoft.com/en-us/dotnet/standard/base-types/standard-date-and-time-format-strings#Roundtrip
System.DateTime dtData = DateTime.Parse(sValue);
//So this is the core date time to work off of
DateTime RelativeToday = DateTime.Today;
DateTime RelativeNow = DateTime.Now;
// ILogger log = AyaNova.Util.ApplicationLogging.CreateLogger("FilterSqlCriteriaBuilder::DataFilterToColumnCriteria");
// log.LogInformation("RelativeToday (before adjustment):");
// log.LogInformation(RelativeToday.ToString());
// log.LogInformation("RelativeNow (before adjustment):");
// log.LogInformation(RelativeNow.ToString());
string sHighEnd = PostgresDateFormat(MaxMilliseconds(dtData));
string sLowEnd = PostgresDateFormat(ZeroMilliseconds(dtData));
if (sValue.StartsWith("{[") && sValue.EndsWith("]}"))
switch (sOperator)
{
case DataListFilterComparisonOperator.Equality:
sb.Append(">='");
sb.Append(sLowEnd);
sb.Append("' AND ");
sb.Append(SqlColumnNameToFilter);
sb.Append(" ");
sb.Append("<='");
sb.Append(sHighEnd);
sb.Append("'");
break;
case DataListFilterComparisonOperator.GreaterThan:
sb.Append(">'");
sb.Append(sLowEnd);
sb.Append("'");
break;
case DataListFilterComparisonOperator.GreaterThanOrEqualTo:
sb.Append(">='");
sb.Append(sLowEnd);
sb.Append("'");
break;
case DataListFilterComparisonOperator.LessThan:
sb.Append("<'");
sb.Append(sHighEnd);
sb.Append("'");
break;
case DataListFilterComparisonOperator.LessThanOrEqualTo:
sb.Append("<='");
sb.Append(sHighEnd);
sb.Append("'");
break;
case DataListFilterComparisonOperator.NotEqual:
sb.Append("<'");
sb.Append(sLowEnd);
sb.Append("' OR ");
sb.Append(SqlColumnNameToFilter);
sb.Append(" ");
sb.Append(">'");
sb.Append(sHighEnd);
sb.Append("'");
break;
default:
throw new System.ArgumentOutOfRangeException("OPERATOR_TYPE", sOperator, "DataListSqlFilterCriteriaBuilder unhandled operator type [" + sOperator + "] IN DATE_TIME");
//Need to adjust RelativeToday to users time frame
//Fetch useroptions object and relative time offset
//See servers spec doc core-locale-currency-numbers-time-and-dates.txt for details about why this is necessary to be done this way
AyaNova.Models.AyContext ct = AyaNova.Util.ServiceProviderProvider.DBContext;
var u = ct.User.AsNoTracking().Where(a => a.Id == userId).Select(m => new { tz = m.UserOptions.TimeZoneOffset }).First();
//Add this value to any time's hours to convert to user local time
Double TimeZoneAdjustment = ((double)u.tz) * -1;
//Stock times used for many of the tokens:
RelativeToday = RelativeToday.AddHours(TimeZoneAdjustment);//flip the sign to adjust towards UTC
RelativeNow = RelativeNow.AddHours(TimeZoneAdjustment);//flip the sign to adjust towards UTC
//TESTING:
//LOG THE CRIT AND QUERY
// ILogger log = AyaNova.Util.ApplicationLogging.CreateLogger("FilterSqlCriteriaBuilder::DataFilterToColumnCriteria");
// log.LogInformation("RelativeToday (adjusted):");
// log.LogInformation(RelativeToday.ToString());
// log.LogInformation("RelativeNow (adjusted):");
// log.LogInformation(RelativeNow.ToString());
// log.LogInformation("Offset used:");
// log.LogInformation(u.tz.ToString());
#region Build criteria for date RANGE TOKEN specified
//Used as the basis point
System.DateTime dtAfter;
System.DateTime dtBefore;
switch (sValue)
{
//Case 402
case DataListFilterSpecialToken.Yesterday:
//Between Day before yesterday at midnight and yesterday at midnight
dtAfter = RelativeToday.AddDays(-1);
dtAfter = dtAfter.AddSeconds(-1);
dtBefore = RelativeToday;//.AddDays(-1);
BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
break;
case DataListFilterSpecialToken.Today:
//Between yesterday at midnight and tommorow at midnight
dtAfter = RelativeToday.AddSeconds(-1);
dtBefore = RelativeToday.AddDays(1);
BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
break;
case DataListFilterSpecialToken.Tomorrow:
//Between Tonight at midnight and day after tommorow at midnight
dtAfter = RelativeToday.AddDays(1);
dtAfter = dtAfter.AddSeconds(-1);
dtBefore = RelativeToday.AddDays(2);
BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
break;
//Case 402
case DataListFilterSpecialToken.LastWeek:
//Between two Sundays ago at midnight and last sunday at midnight
dtAfter = RelativeToday;
//go back a week
dtAfter = dtAfter.AddDays(-7);
//go backwards to Sunday
while (dtAfter.DayOfWeek != DayOfWeek.Sunday)
dtAfter = dtAfter.AddDays(-1);
//go to very start of eighth dayahead
dtBefore = dtAfter.AddDays(8);
dtAfter = dtAfter.AddSeconds(-1);
BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
break;
case DataListFilterSpecialToken.ThisWeek:
//Between Sunday at midnight and Next sunday at midnight
dtAfter = RelativeToday;
//go backwards to monday
while (dtAfter.DayOfWeek != DayOfWeek.Monday)
dtAfter = dtAfter.AddDays(-1);
//Now go back to sunday last second
dtAfter = dtAfter.AddSeconds(-1);
dtBefore = RelativeToday;
//go forwards to monday
if (RelativeToday.DayOfWeek == DayOfWeek.Monday)
{
//Monday today? then go to next monday
dtBefore = dtBefore.AddDays(7);
}
else
{
while (dtBefore.DayOfWeek != DayOfWeek.Monday)
dtBefore = dtBefore.AddDays(1);
}
BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
break;
case DataListFilterSpecialToken.NextWeek:
//Between Next Sunday at midnight and Next Next sunday at midnight
dtAfter = RelativeToday;
//If today is monday skip over it first
if (dtAfter.DayOfWeek == DayOfWeek.Monday)
dtAfter = dtAfter.AddDays(1);
//go forwards to next monday
while (dtAfter.DayOfWeek != DayOfWeek.Monday)
dtAfter = dtAfter.AddDays(1);
//Now go back to sunday last second
dtAfter = dtAfter.AddDays(-1);
//go seven days ahead
dtBefore = dtAfter.AddDays(7);
//case 1155
dtAfter = dtAfter.AddSeconds(-1);
BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
break;
case DataListFilterSpecialToken.LastMonth:
//start with the first day of this month
dtAfter = new DateTime(RelativeToday.Year, RelativeToday.Month, 1, RelativeToday.Hour, RelativeToday.Minute, 00);
//subtract a Month
dtAfter = dtAfter.AddMonths(-1);
//Add one month to dtAfter to get end date
dtBefore = dtAfter.AddMonths(1);
//case 1155
dtAfter = dtAfter.AddSeconds(-1);
// 'yyyy-mm-ddTHH:MM:SS'
BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
break;
case DataListFilterSpecialToken.ThisMonth:
//start with the first day of this month
dtAfter = new DateTime(RelativeToday.Year, RelativeToday.Month, 1, RelativeToday.Hour, RelativeToday.Minute, 00);
//Add one month to dtAfter to get end date
dtBefore = dtAfter.AddMonths(1);
//case 1155
dtAfter = dtAfter.AddSeconds(-1);
BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
break;
case DataListFilterSpecialToken.NextMonth:
//start with the first day of this month
dtAfter = new DateTime(RelativeToday.Year, RelativeToday.Month, 1, RelativeToday.Hour, RelativeToday.Minute, 00);
//Add a Month
dtAfter = dtAfter.AddMonths(1);
//Add one month to dtAfter to get end date
dtBefore = dtAfter.AddMonths(1);
//case 1155
dtAfter = dtAfter.AddSeconds(-1);
BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
break;
case DataListFilterSpecialToken.FourteenDayWindow:
//start with today zero hour
dtAfter = new DateTime(RelativeToday.Year, RelativeToday.Month, RelativeToday.Day, RelativeToday.Hour, RelativeToday.Minute, 00);
dtAfter = dtAfter.AddDays(-7);
//Add 15 days to get end date (zero hour so not really 15 full days)
dtBefore = dtAfter.AddDays(15);
//case 1155
dtAfter = dtAfter.AddSeconds(-1);
BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
break;
//case 2067 ADDITIONAL DATE RANGES ************
case DataListFilterSpecialToken.Past:
//Forever up to Now
dtAfter = new DateTime(1753, 1, 2, 00, 00, 00);
dtBefore = DateTime.UtcNow;
BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
break;
case DataListFilterSpecialToken.Future:
//From Now to forever (999 years from now)
dtAfter = DateTime.UtcNow;
dtBefore = DateTime.UtcNow.AddYears(999);
BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
break;
case DataListFilterSpecialToken.LastYear:
//From zero hour january 1 a year ago
dtAfter = new DateTime(RelativeNow.AddYears(-1).Year, 1, 1, 0, 0, 00).AddSeconds(-1).AddHours(TimeZoneAdjustment);
//To zero hour January 1 this year
dtBefore = new DateTime(RelativeNow.Year, 1, 1, 0, 0, 00).AddHours(TimeZoneAdjustment);
BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
break;
case DataListFilterSpecialToken.ThisYear:
//From zero hour january 1 this year
dtAfter = new DateTime(RelativeNow.Year, 1, 1, 00, 00, 00).AddSeconds(-1).AddHours(TimeZoneAdjustment);
//To zero hour Jan 1 next year
dtBefore = new DateTime(RelativeNow.AddYears(1).Year, 1, 1, 00, 00, 00).AddHours(TimeZoneAdjustment);
BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
break;
case DataListFilterSpecialToken.InTheLast3Months:
//From Now minus 3 months
dtAfter = DateTime.UtcNow.AddMonths(-3);
//To Now
dtBefore = DateTime.UtcNow;
BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
break;
case DataListFilterSpecialToken.InTheLast6Months:
//From Now minus 6 months
dtAfter = DateTime.UtcNow.AddMonths(-6);
//To Now
dtBefore = DateTime.UtcNow;
BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
break;
case DataListFilterSpecialToken.InTheLastYear:
//From Now minus 365 days
dtAfter = DateTime.UtcNow.AddDays(-365);
//To Now
dtBefore = DateTime.UtcNow;
BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
break;
//=======================
//NEW ONES FOR RAVEN
case DataListFilterSpecialToken.YearToDate:
//From zero hour january 1 this year
dtAfter = new DateTime(RelativeNow.Year, 1, 1, 00, 00, 00).AddSeconds(-1).AddHours(TimeZoneAdjustment); ;
//To now
dtBefore = RelativeNow;
BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
break;
case DataListFilterSpecialToken.Past90Days:
//From Now minus 90 days
dtAfter = DateTime.UtcNow.AddDays(-90);
//To Now
dtBefore = DateTime.UtcNow;
BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
break;
case DataListFilterSpecialToken.Past30Days:
//From Now minus 30 days
dtAfter = DateTime.UtcNow.AddDays(-30);
//To Now
dtBefore = DateTime.UtcNow;
BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
break;
case DataListFilterSpecialToken.Past24Hours:
//From Now minus 24 hours
dtAfter = DateTime.UtcNow.AddHours(-24);
//To Now
dtBefore = DateTime.UtcNow;
BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
break;
case DataListFilterSpecialToken.January:
//From zero hour january 1 this year
dtAfter = new DateTime(RelativeNow.Year, 1, 1, 00, 00, 00).AddSeconds(-1).AddHours(TimeZoneAdjustment);
//To zero hour feb 1 this year
dtBefore = new DateTime(RelativeNow.Year, 2, 1, 00, 00, 00).AddHours(TimeZoneAdjustment);
BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
break;
case DataListFilterSpecialToken.February:
dtAfter = new DateTime(RelativeNow.Year, 2, 1, 00, 00, 00).AddSeconds(-1).AddHours(TimeZoneAdjustment);
dtBefore = new DateTime(RelativeNow.Year, 3, 1, 00, 00, 00).AddHours(TimeZoneAdjustment);
BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
break;
case DataListFilterSpecialToken.March:
dtAfter = new DateTime(RelativeNow.Year, 3, 1, 00, 00, 00).AddSeconds(-1).AddHours(TimeZoneAdjustment);
dtBefore = new DateTime(RelativeNow.Year, 4, 1, 00, 00, 00).AddHours(TimeZoneAdjustment);
BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
break;
case DataListFilterSpecialToken.April:
dtAfter = new DateTime(RelativeNow.Year, 4, 1, 00, 00, 00).AddSeconds(-1).AddHours(TimeZoneAdjustment);
dtBefore = new DateTime(RelativeNow.Year, 5, 1, 00, 00, 00).AddHours(TimeZoneAdjustment);
BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
break;
case DataListFilterSpecialToken.May:
dtAfter = new DateTime(RelativeNow.Year, 5, 1, 00, 00, 00).AddSeconds(-1).AddHours(TimeZoneAdjustment);
dtBefore = new DateTime(RelativeNow.Year, 6, 1, 00, 00, 00).AddHours(TimeZoneAdjustment);
BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
break;
case DataListFilterSpecialToken.June:
dtAfter = new DateTime(RelativeNow.Year, 6, 1, 00, 00, 00).AddSeconds(-1).AddHours(TimeZoneAdjustment);
dtBefore = new DateTime(RelativeNow.Year, 7, 1, 00, 00, 00).AddHours(TimeZoneAdjustment);
BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
break;
case DataListFilterSpecialToken.July:
dtAfter = new DateTime(RelativeNow.Year, 7, 1, 00, 00, 00).AddSeconds(-1).AddHours(TimeZoneAdjustment);
dtBefore = new DateTime(RelativeNow.Year, 8, 1, 00, 00, 00).AddHours(TimeZoneAdjustment);
BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
break;
case DataListFilterSpecialToken.August:
dtAfter = new DateTime(RelativeNow.Year, 8, 1, 00, 00, 00).AddSeconds(-1).AddHours(TimeZoneAdjustment);
dtBefore = new DateTime(RelativeNow.Year, 9, 1, 00, 00, 00).AddHours(TimeZoneAdjustment);
BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
break;
case DataListFilterSpecialToken.September:
dtAfter = new DateTime(RelativeNow.Year, 9, 1, 00, 00, 00).AddSeconds(-1).AddHours(TimeZoneAdjustment);
dtBefore = new DateTime(RelativeNow.Year, 10, 1, 00, 00, 00).AddHours(TimeZoneAdjustment);
BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
break;
case DataListFilterSpecialToken.October:
dtAfter = new DateTime(RelativeNow.Year, 10, 1, 00, 00, 00).AddSeconds(-1).AddHours(TimeZoneAdjustment);
dtBefore = new DateTime(RelativeNow.Year, 11, 1, 00, 00, 00).AddHours(TimeZoneAdjustment);
BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
break;
case DataListFilterSpecialToken.November:
dtAfter = new DateTime(RelativeNow.Year, 11, 1, 00, 00, 00).AddSeconds(-1).AddHours(TimeZoneAdjustment);
dtBefore = new DateTime(RelativeNow.Year, 12, 1, 00, 00, 00).AddHours(TimeZoneAdjustment);
BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
break;
case DataListFilterSpecialToken.December:
//From zero hour dec 1 this year
dtAfter = new DateTime(RelativeNow.Year, 12, 1, 00, 00, 00).AddSeconds(-1).AddHours(TimeZoneAdjustment);
//To zero hour Jan 1 next year
dtBefore = new DateTime(RelativeNow.AddYears(1).Year, 1, 1, 00, 00, 00).AddHours(TimeZoneAdjustment);
BuildBetweenTwoDatesFragment(SqlColumnNameToFilter, sb, dtAfter, dtBefore);
break;
default:
throw new System.ArgumentOutOfRangeException("TOKEN", sOperator, "DataListSqlFilterCriteriaBuilder invalid filter TOKEN type [" + sValue + "] IN DATE_TIME");
//-----
}
#endregion
}
else
{
#region Build criteria for date specified
//RAVEN NOTE: it is my intention that dates come in iso8601 UTC format from the client
//so a simple parse should be sufficient
//https://docs.microsoft.com/en-us/dotnet/standard/base-types/standard-date-and-time-format-strings#Roundtrip
System.DateTime dtData = DateTime.Parse(sValue);
string sHighEnd = PostgresDateFormat(MaxMilliseconds(dtData));
string sLowEnd = PostgresDateFormat(ZeroMilliseconds(dtData));
switch (sOperator)
{
case DataListFilterComparisonOperator.Equality:
sb.Append(">='");
sb.Append(sLowEnd);
sb.Append("' AND ");
sb.Append(SqlColumnNameToFilter);
sb.Append(" ");
sb.Append("<='");
sb.Append(sHighEnd);
sb.Append("'");
break;
case DataListFilterComparisonOperator.GreaterThan:
sb.Append(">'");
sb.Append(sLowEnd);
sb.Append("'");
break;
case DataListFilterComparisonOperator.GreaterThanOrEqualTo:
sb.Append(">='");
sb.Append(sLowEnd);
sb.Append("'");
break;
case DataListFilterComparisonOperator.LessThan:
sb.Append("<'");
sb.Append(sHighEnd);
sb.Append("'");
break;
case DataListFilterComparisonOperator.LessThanOrEqualTo:
sb.Append("<='");
sb.Append(sHighEnd);
sb.Append("'");
break;
case DataListFilterComparisonOperator.NotEqual:
sb.Append("<'");
sb.Append(sLowEnd);
sb.Append("' OR ");
sb.Append(SqlColumnNameToFilter);
sb.Append(" ");
sb.Append(">'");
sb.Append(sHighEnd);
sb.Append("'");
break;
default:
throw new System.ArgumentOutOfRangeException("OPERATOR_TYPE", sOperator, "DataListSqlFilterCriteriaBuilder unhandled operator type [" + sOperator + "] IN DATE_TIME");
}
#endregion
}
#endregion
//}
}
break;
case UiFieldDataType.Enum://enums are just ints to the db, but it's a special type so the client can recognize it