using System.Collections.Generic;
public static void Main()
var expirationFilter = QuoteExpirationDateFilter.InSevenDays;
List<Quote> quotes = new() {
new() { Id = 1, ExpirationDate = null },
new() { Id = 2, ExpirationDate = new DateTimeOffset(2025, 2, 24, 0, 0, 0, TimeSpan.Zero) },
new() { Id = 3, ExpirationDate = new DateTimeOffset(2025, 2, 28, 0, 0, 0, TimeSpan.Zero) },
new() { Id = 4, ExpirationDate = new DateTimeOffset(2025, 3, 1, 0, 0, 0, TimeSpan.Zero) },
new() { Id = 5, ExpirationDate = new DateTimeOffset(2025, 3, 31, 0, 0, 0, TimeSpan.Zero) },
new() { Id = 6, ExpirationDate = new DateTimeOffset(2025, 4, 1, 0, 0, 0, TimeSpan.Zero) },
new() { Id = 7, ExpirationDate = new DateTimeOffset(2025, 2, 19, 0, 0, 0, TimeSpan.Zero) },
new() { Id = 8, ExpirationDate = new DateTimeOffset(2025, 9, 1, 0, 0, 0, TimeSpan.Zero) },
new() { Id = 9, ExpirationDate = new DateTimeOffset(2026, 1, 1, 0, 0, 0, TimeSpan.Zero) },
new() { Id = 10, ExpirationDate = new DateTimeOffset(2025, 3, 4, 0, 0, 0, TimeSpan.Zero) },
DateTimeOffset? customStartDate = expirationFilter == QuoteExpirationDateFilter.Custom
? new DateTimeOffset(2025, 2, 24, 0, 0, 0, TimeSpan.Zero)
DateTimeOffset? customEndDate = expirationFilter == QuoteExpirationDateFilter.Custom
? new DateTimeOffset(2025, 3, 3, 23, 59, 59, TimeSpan.Zero)
var expirationStart = MapToExpirationStartDate(expirationFilter, customStartDate);
var expirationStartOriginal = MapToExpirationStartDateOriginal(expirationFilter, customStartDate);
var expirationEnd = MapToExpirationEndDate(expirationFilter, customEndDate);
var expirationEndOriginal = MapToExpirationEndDateOriginal(expirationFilter, customEndDate);
Console.WriteLine("Quotes");
Console.WriteLine(new string('-', 131));
foreach (var quote in quotes) {
Console.WriteLine($"Id: {quote.Id,2:D} | Expiration date: {quote.ExpirationDate,19:yyyy-MM-dd HH:mm:ss} | Actual expiration date: {quote.ActualExpirationDate,19:yyyy-MM-dd HH:mm:ss} | Should be found: {(quote.ExpirationDate >= expirationStart && quote.ExpirationDate < expirationEnd ? "Yes" : " ")} | Was found: {(quote.ExpirationDate >= expirationStartOriginal && quote.ExpirationDate < expirationEndOriginal ? "Yes" : "")}");
Console.WriteLine("Filter");
Console.WriteLine(new string('-', 91));
Console.WriteLine($"Type: {expirationFilter}");
Console.WriteLine($"Start: {expirationStart:yyyy-MM-dd HH:mm:ss.fff} | Original: {expirationStartOriginal:yyyy-MM-dd HH:mm:ss.fff}");
Console.WriteLine($"End: {expirationEnd:yyyy-MM-dd HH:mm:ss.fff} | Original: {expirationEndOriginal:yyyy-MM-dd HH:mm:ss.fff}");
var query = quotes.AsQueryable();
if (expirationStart.HasValue)
query = query.Where(q => q.ExpirationDate >= expirationStart);
if (expirationEnd.HasValue)
query = query.Where(q => q.ExpirationDate < expirationEnd);
var filteredQuotes = query.ToList();
Console.WriteLine("Filtered quotes");
Console.WriteLine(new string('-', 91));
foreach (var quote in filteredQuotes)
Console.WriteLine($"Id: {quote.Id,2:D} | Expiration date: {quote.ExpirationDate:yyyy-MM-dd HH:mm:ss} | Actual expiration date: {quote.ActualExpirationDate:yyyy-MM-dd HH:mm:ss}");
private static DateTimeOffset? MapToExpirationStartDate(QuoteExpirationDateFilter? quoteExpirationDateFilter, DateTimeOffset? startDate)
var nextMonth = DateTime.UtcNow.Date.AddMonths(1);
return quoteExpirationDateFilter switch {
QuoteExpirationDateFilter.InSevenDays or
QuoteExpirationDateFilter.ThisMonth or
QuoteExpirationDateFilter.InSixMonths => DateTime.UtcNow.Date.AddMilliseconds(1),
QuoteExpirationDateFilter.NextMonth => new DateTime(nextMonth.Year, nextMonth.Month, 1).AddDays(1),
QuoteExpirationDateFilter.ThisYear => new DateTime(DateTime.UtcNow.Year, 1, 1).AddMilliseconds(-1),
QuoteExpirationDateFilter.Custom => startDate?.Date.AddMilliseconds(1),
private static DateTimeOffset? MapToExpirationEndDate(QuoteExpirationDateFilter? quoteExpirationDateFilter, DateTimeOffset? endDate)
var beginningOfThisMonth = new DateTime(DateTime.UtcNow.Year, DateTime.UtcNow.Month, 1);
return quoteExpirationDateFilter switch {
QuoteExpirationDateFilter.InSevenDays => DateTime.UtcNow.Date.AddDays(8).AddMilliseconds(1),
QuoteExpirationDateFilter.ThisMonth => beginningOfThisMonth.AddMonths(1).AddMilliseconds(1),
QuoteExpirationDateFilter.NextMonth => beginningOfThisMonth.AddMonths(2).AddMilliseconds(1),
QuoteExpirationDateFilter.InSixMonths => beginningOfThisMonth.AddMonths(7).AddMilliseconds(1),
QuoteExpirationDateFilter.ThisYear => new DateTime(DateTime.UtcNow.Year + 1, 1, 1).AddMilliseconds(1),
QuoteExpirationDateFilter.Custom => endDate?.Date.AddDays(1).AddMilliseconds(1),
private static DateTimeOffset? MapToExpirationStartDateOriginal(QuoteExpirationDateFilter? quoteExpirationDateFilter, DateTimeOffset? startDate)
var nextMonth = DateTime.UtcNow.Date.AddMonths(1);
return quoteExpirationDateFilter switch {
QuoteExpirationDateFilter.InSevenDays or
QuoteExpirationDateFilter.ThisMonth or
QuoteExpirationDateFilter.InSixMonths => DateTime.UtcNow.Date,
QuoteExpirationDateFilter.NextMonth => new DateTime(nextMonth.Year, nextMonth.Month, 1),
QuoteExpirationDateFilter.ThisYear => new DateTime(DateTime.UtcNow.Year, 1, 1),
QuoteExpirationDateFilter.Custom => startDate,
private static DateTimeOffset? MapToExpirationEndDateOriginal(QuoteExpirationDateFilter? quoteExpirationDateFilter, DateTimeOffset? endDate)
var beginningOfThisMonth = new DateTime(DateTime.UtcNow.Year, DateTime.UtcNow.Month, 1);
return quoteExpirationDateFilter switch {
QuoteExpirationDateFilter.InSevenDays => DateTime.UtcNow.Date.AddDays(8).AddMilliseconds(-1),
QuoteExpirationDateFilter.ThisMonth => beginningOfThisMonth.AddMonths(1).AddMilliseconds(-1),
QuoteExpirationDateFilter.NextMonth => beginningOfThisMonth.AddMonths(2).AddMilliseconds(-1),
QuoteExpirationDateFilter.InSixMonths => beginningOfThisMonth.AddMonths(7).AddMilliseconds(-1),
QuoteExpirationDateFilter.ThisYear => new DateTime(DateTime.UtcNow.Year + 1, 1, 1).AddMilliseconds(-1),
QuoteExpirationDateFilter.Custom => endDate,
public int Id { get; set; }
public DateTimeOffset? ExpirationDate { get; set; }
public DateTimeOffset? ActualExpirationDate => ExpirationDate?.AddSeconds(-1);
public enum QuoteExpirationDateFilter