簡體   English   中英

C# Linq 兩個日期之間的日期

[英]C# Linq Where Date Between 2 Dates

我正在嘗試獲取我的 linq 語句以獲取兩個日期之間的所有記錄,但我不太確定需要更改哪些內容才能使其正常工作: (a.Start >= startDate && endDate)

var appointmentNoShow =
    from a in appointments
    from p in properties
    from c in clients
    where a.Id == p.OID && (a.Start.Date >= startDate.Date && endDate)

只需將其更改為

var appointmentNoShow = from a in appointments
                        from p in properties
                        from c in clients
                        where a.Id == p.OID && 
                       (a.Start.Date >= startDate.Date && a.Start.Date <= endDate)
var appointmentNoShow = from a in appointments
                        from p in properties
                        from c in clients
                        where a.Id == p.OID
                        where a.Start.Date >= startDate.Date
                        where a.Start.Date <= endDate.Date
var QueryNew = _context.Appointments.Include(x => x.Employee).Include(x => x.city).Where(x => x.CreatedOn >= FromDate).Where(x => x.CreatedOn <= ToDate).Where(x => x.IsActive == true).ToList();

所以你向下滾動,因為答案不起作用:

這就像魔術一樣(但他們說它對大數據有效率問題,而且你不像我一樣關心)

1-在我的情況下,數據庫中的數據類型是“日期時間”和“可空”。

DB中的示例數據格式如下:

2018-11-06 15:33:43.640

轉換為字符串時,C# 中的一個類似於:

2019-01-03 4:45:16 PM

所以格式是:

yyyy/MM/dd hh:mm:ss tt

2-所以你需要先以正確的格式准備你的日期時間變量:

示例 1

yourDate.ToString("yyyy/MM/dd hh:mm:ss tt")

示例 2 - 過去 30 天的日期時間范圍

    DateTime dateStart = DateTime.Now.AddDays(-30);
    DateTime dateEnd = DateTime.Now.AddDays(1).AddTicks(-1);

3-最后是你失去一天試圖找到的 linq 查詢(需要 EF 6)

using System.Data.Entity;

_dbContext.Shipments.Where(s => (DbFunctions.TruncateTime(s.Created_at.Value) >= dateStart && DbFunctions.TruncateTime(s.Created_at.Value) <= dateEnd)).Count();

還要考慮時間比較:

(DbFunctions.CreateDateTime(s.Created_at.Value.Year, s.Created_at.Value.Month, s.Created_at.Value.Day, s.Created_at.Value.Hour, s.Created_at.Value.Minute, s.Created_at.Value.Second) >= dateStart && DbFunctions.CreateDateTime(s.Created_at.Value.Year, s.Created_at.Value.Month, s.Created_at.Value.Day, s.Created_at.Value.Hour, s.Created_at.Value.Minute, s.Created_at.Value.Second) <= dateEnd)

請注意,其他 stackoverflow 問題和答案中提到的以下方法將無法正常工作:

....
&&
(
    s.Created_at.Value.Day >= dateStart.Day && s.Created_at.Value.Day <= dateEnd.Day &&
    s.Created_at.Value.Month >= dateStart.Month && s.Created_at.Value.Month <= dateEnd.Month &&
    s.Created_at.Value.Year >= dateStart.Year && s.Created_at.Value.Year <= dateEnd.Year
)).count();

例如,如果開始日在本月,結束日在下個月,則查詢將返回 false 並且沒有結果,例如:

DatabaseCreatedAtItemThatWeWant = 2018/12/05

開始日期 = 2018/12/01

結束日期 = 2019/01/04

查詢將始終搜索 01 和 04 之間的天數,而不考慮“月”,因此“s.Created_at.Value.Day <= dateEnd.Day”將失敗

如果你有非常大的數據,你會執行 Native SQL Query 而不是 linq

...
    ... where Shipments.Created_at BETWEEN CAST(@Created_at_from as datetime) AND CAST(@Created_at_to as datetime))
    ....

謝謝

如果有人有興趣知道如何使用 2 列表和日期之間

var newList = firstList.Where(s => secondList.Any(secL => s.Start > secL.RangeFrom && s.End < secL.RangeTo))

如果您有日期間隔過濾條件,並且您需要選擇部分屬於此過濾范圍的所有記錄。 假設:記錄具有 ValidFrom 和 ValidTo 屬性。

DateTime intervalDateFrom = new DateTime(1990, 01, 01);
DateTime intervalDateTo = new DateTime(2000, 01, 01);

var itemsFiltered = allItems.Where(x=> 
    (x.ValidFrom >= intervalDateFrom && x.ValidFrom <= intervalDateTo) ||
    (x.ValidTo >= intervalDateFrom && x.ValidTo <= intervalDateTo) ||
    (intervalDateFrom >= x.ValidFrom && intervalDateFrom <= x.ValidTo) ||
    (intervalDateTo >= x.ValidFrom && intervalDateTo <= x.ValidTo)
);

 public List<tbltask> gettaskssdata(int? c, int? userid, string a, string StartDate, string EndDate, int? ProjectID, int? statusid) { List<tbltask> tbtask = new List<tbltask>(); DateTime sdate = (StartDate != "") ? Convert.ToDateTime(StartDate).Date : new DateTime(); DateTime edate = (EndDate != "") ? Convert.ToDateTime(EndDate).Date : new DateTime(); tbtask = entity.tbltasks.Include(x => x.tblproject).Include(x => x.tbUser). Where(x => x.tblproject.company_id == c && (ProjectID == 0 || ProjectID == x.tblproject.ProjectId) && (statusid == 0 || statusid == x.tblstatu.StatusId) && (a == "" || (x.TaskName.Contains(a) || x.tbUser.User_name.Contains(a))) && ((StartDate == "" && EndDate == "") || ((x.StartDate >= sdate && x.EndDate <= edate)))).ToList(); return tbtask; }

這是我對基於 searchdata 和開始到結束日期之間的搜索記錄的查詢

我在讓它工作時遇到了問題。

我在 db 行中有兩個日期,我需要將它們添加到昨天、今天和明天的列表中。

這是我的解決方案:

        var yesterday = DateTime.Today.AddDays(-1);
        var today = DateTime.Today;
        var tomorrow = DateTime.Today.AddDays(1);            
        var vm = new Model()
        {
            Yesterday = _context.Table.Where(x => x.From <= yesterday && x.To >= yesterday).ToList(),
            Today = _context.Table.Where(x => x.From <= today & x.To >= today).ToList(),
            Tomorrow = _context.Table.Where(x => x.From <= tomorrow & x.To >= tomorrow).ToList()
        };

您可以使用DbFunctions.TruncateTime(StartDateTime)從日期時間中刪除時間

var appointmentNoShow =
from a in appointments
from p in properties
from c in clients
where a.Id == p.OID && (DbFunctions.TruncateTime(a.Start) >= DbFunctions.TruncateTime(startDate) && endDate)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM