Создайте дату и время с промежутком времени 24/7 (повторяйте каждый день)

Я создал метод списка, который получает общее количество проданных продуктов в моем приложении MVC/ASP.NET. Мне нужно добавить параметр DateTime к методу списка, который сообщает ему, что нужно продавать только продукты, сделанные накануне.

Назначение этого списка в том, чтобы клиент мог видеть, что он продал за предыдущий день и количество проданных товаров. Это просто статистика продаж.

Я не уверен, как создать временной интервал для метода, из которого можно получить элементы. Я думал об использовании даты и времени в качестве параметра метода списка, а затем объявлял временной интервал. Я не уверен, как подойти к этому, хотя ..

Это мой метод IList:

public IList<BestsellersReportLine> DailyBestSellersReport(int billingCountryId = 0,
            int recordsToReturn = 5, int orderBy = 1, int groupBy = 1, bool showHidden = false)
        {


                var query1 = from opv in _opvRepository.Table
                         join o in _orderRepository.Table on opv.OrderId equals o.Id
                         join pv in _productVariantRepository.Table on opv.ProductVariantId equals pv.Id
                         join p in _productRepository.Table on pv.ProductId equals p.Id
                         select opv;


                var query2 = groupBy == 1 ?
                    //group by product variants
                       from opv in query1
                       group opv by opv.ProductVariantId into g
                       select new
                       {
                           EntityId = g.Key,
                           TotalAmount = g.Sum(x => x.PriceExclTax),
                           TotalQuantity = g.Sum(x => x.Quantity),
                       }
                       :
                    //group by products
                       from opv in query1
                       group opv by opv.ProductVariant.ProductId into g
                       select new
                       {
                           EntityId = g.Key,
                           TotalAmount = g.Sum(x => x.PriceExclTax),
                           TotalQuantity = g.Sum(x => x.Quantity),
                       }
                       ;

                switch (orderBy)
                {
                    case 1:
                        {
                            query2 = query2.OrderByDescending(x => x.TotalQuantity);
                        }
                        break;
                    case 2:
                        {
                            query2 = query2.OrderByDescending(x => x.TotalAmount);
                        }
                        break;
                    default:
                        throw new ArgumentException("Wrong orderBy parameter", "orderBy");
                }

                if (recordsToReturn != 0 && recordsToReturn != int.MaxValue)
                    query2 = query2.Take(recordsToReturn);

                var result = query2.ToList().Select(x =>
                {
                    var reportLine = new BestsellersReportLine()
                    {
                        EntityId = x.EntityId,
                        TotalAmount = x.TotalAmount,
                        TotalQuantity = x.TotalQuantity
                    };
                    return reportLine;
                }).ToList();

                return result;

        }

Я создал эти переменные для работы, не знаю, правильно ли это?:

        DateTime CurrentDay = DateTime.Now;
        DateTime PreviousDay = DateTime.Now.AddDays(-1);

        DateTime TimeFrame = DateTime.Parse("00:00:00 AM");

Любые идеи?

Благодарю вас!

//Крис


person WhoAmI    schedule 24.01.2014    source источник
comment
Где вы хотите использовать TimeSpan?   -  person Håkan Fahlstedt    schedule 24.01.2014
comment
Хейсан! Я хотел бы, чтобы метод получал элементы в течение определенного промежутка времени. Это будет запланированная задача, работающая в фоновом режиме, и ее необходимо выполнять в конце каждого дня. Таким образом, если метод был выполнен в этот день (после 00:00 2014-01-24), он получит все товары, проданные вчера (2014-01-24) с 00:00 до 00:00. Затем повторяйте этот процесс каждый день. Надеюсь, это имеет смысл   -  person WhoAmI    schedule 24.01.2014
comment
Хорошо, вы можете использовать DateTime.Now и создать новый DateTime, используя год, месяц и день из вызова DateTime.Now, чтобы получить DateTime с 00:00. Затем используйте DateTime.AddDays(-1), чтобы получить вторую дату и использовать эти дни для сравнения. В качестве альтернативы создайте TimeSpan, используя эту технику. Если это то, о чем вы спрашиваете, я мог бы попытаться сформулировать ответ.   -  person Håkan Fahlstedt    schedule 24.01.2014
comment
Да, это все. Datetime.now, вероятно, идеален в этом контексте, поскольку он должен откуда-то исходить. Я думал о AddDays, но я не совсем уверен, как написать код для этого, раньше не использовал datetime в таком контексте.   -  person WhoAmI    schedule 24.01.2014


Ответы (3)


var yesterday = DateTime.Now.Subtract( new TimeSpan( 1, 0, 0, 0 ) );
var earliest = new DateTime( yesterday.Year, yesterday.Month, yesterday.Day, 0, 0, 0 );
var latest = earliest.Add( new TimeSpan( 1, 0, 0, 0, -1 ) );

Использование;

where earliest <= dateToTest && latest >= dateToTest
person Moho    schedule 24.01.2014
comment
Это гениально, спасибо! Что именно представляет число в пределах ( ) вчера и последний = самый ранний. Я подозреваю, что 1 для дня, но есть 4 цифры. Вы не используете конкретное время? - person WhoAmI; 24.01.2014
comment
Промежуток времени (дни, часы, минуты, секунды, [миллисекунды]), поэтому последнее использование для вычисления latest добавляет 1 день, но вычитает 1 миллисекунду, что даст вам последнюю миллисекунду этого дня. - person Moho; 24.01.2014
comment
Ясно спасибо. И ‹= dateToTest && last ›= dateToTest представляет ‹= сегодня && last ›= вчера? Я использовал DateTime.Now на сегодня и DateTime.Now.AddDays(-1) на вчера. Я не должен устанавливать дату, так как процесс должен повторяться каждый день, а не в определенный день. - person WhoAmI; 24.01.2014
comment
dateToTest будет свойством сущностей, которые являются DateTime, в которые вы хотите попасть в расчетный диапазон дат. - person Moho; 24.01.2014

Ты можешь использовать,

 var range = new
        {
            Start = DateTime.Today.AddDays(-1),
            End = DateTime.Today.AddSeconds(-1)
        };

и использовать его как,

(DateOfSale>=range.Start && DateOfSale<=range.End)
person Mat J    schedule 24.01.2014
comment
Это может сработать для меня. У меня есть переменные StarTime и EndTime из базы данных, но я не уверен, чем заменить DateOfSale. Могу ли я заменить DateOfSale на DateTime.now.addDays(-1), так как я не хочу проверять вчерашнюю дату? Благодарю вас! - person WhoAmI; 31.01.2014
comment
@KristofferAndersson DateOfSale — это имя столбца (или имя свойства), которое содержит дату для проверки. - person Mat J; 31.01.2014
comment
Хорошо, могу ли я установить Start как DateOfSale как его AddDays (-1), представляющий вчерашний день? - person WhoAmI; 31.01.2014
comment
В моем ответе выше range.Start содержит вчерашнюю дату в 12.00 am в начале дня, а range.End содержит вчерашнюю дату в 11:59PM в конце дня. Это необходимо, если вы хотите проверить дату, включая информацию о времени. - person Mat J; 31.01.2014
comment
Ой, извините, мой вопрос был плохо сформулирован. Мне нужны только 2 даты. Сегодня и вчера, хотя я не могу указать определенную дату, например: 2014-01-31, потому что эта функция предназначена для повторения каждый день. Что я хочу проверить, так это то, какие продукты были проданы между startDate и endDate (сегодня и вчера). Нужен ли мне третий DateTime для расчета времени между startDate и endDate? У меня есть эти даты из базы данных: startTimeUtc, endTimeUtc и CreatedOnUtc. Спасибо - person WhoAmI; 31.01.2014
comment
Где хранить дату продажи товара? В вашем вопросе я не вижу, чтобы какое-либо свойство даты использовалось ни в одном из объектов, на которые есть ссылки в запросе. - person Mat J; 31.01.2014

Ответ прост, вы можете рассчитать дату в 12:00, а затем продолжить работу как

   DateTime Today12AMDate = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 0, 0, 0);
   DateTime PreviousDay12AMDate = Today12AMDate.AddDays(-1);

Ваше состояние будет выглядеть так:

where dateFromDatabase <= Today12AMDate && dateFromDatabase >= PreviousDay12AMDate
person dbw    schedule 24.01.2014