【问题标题】:Linq to produce custom period in days, hours, minutes and secondsLinq 以天、小时、分钟和秒为单位生成自定义周期
【发布时间】:2016-12-10 19:56:07
【问题描述】:
var resultsFromSql = from wb in reportContext.WorkItems
                             where wi.DateRequired >= model.FirstDate && wi.DateRequired <= model.SecondDate
                             select new
                             {
                                 wi.Reference,
                                 dateRequired = SqlFunctions.DatePart("yyyy", wi.DateRequired) + "/" + SqlFunctions.DatePart("mm", wi.DateRequired) + "/" + SqlFunctions.DatePart("dd", wi.DateRequired),
                                 earliestActionDate = SqlFunctions.DatePart("yyyy", wi.EarliestActionDate) + "/" + SqlFunctions.DatePart("mm", wi.EarliestActionDate) + "/" + SqlFunctions.DatePart("dd", wi.EarliestActionDate),
                                 mainRef = wi.MainReferenceId != 0 ? wi.MainReferenceId.ToString() : " ",
                                 subRef = wi.SecondaryReference ?? "",
                                 details = wi.DisplayDetails ?? "",
                                 createdOn = SqlFunctions.DatePart("yyyy", wi.CreatedOn) + "/" + SqlFunctions.DatePart("mm", wi.CreatedOn) + "/" + SqlFunctions.DatePart("dd", wi.CreatedOn),*/ /*wi.UpdatedBy,
                                 updatedOn = SqlFunctions.DatePart("yyyy", wi.UpdatedOn) + "/" + SqlFunctions.DatePart("mm", wi.UpdatedOn) + "/" + SqlFunctions.DatePart("dd", wi.UpdatedOn),
                                 timeTaken = SqlFunctions.DateDiff("day", wi.UpdatedOn, wi.CreatedOn) + " days " 
                                        /*+ SqlFunctions.DatePart("h", wi.UpdatedOn - wi.CreatedOn) + ":"
                                        + SqlFunctions.DatePart("n", wi.UpdatedOn - wi.CreatedOn) + ":"
                                        + SqlFunctions.DatePart("s", wi.UpdatedOn - wi.CreatedOn)*/,
                                 timeStuff = SqlFunctions.DatePart("h", wi.UpdatedOn /*- wi.CreatedOn*/)
                             };

由于 DatePart 不支持小时数等,TimeTaken 和 TimeStuff 无法工作,并且我收到与 timeTaken 的注释部分的 dateTime 数学有关的其他错误。如何创建 x 天、小时、分钟和秒的 timeTaken 值,它是从 updatedOn 减去 createdOn 计算的时间长度,它是 dateTimes。

/*List<T> list = new List<T>();*/
            foreach (var res in resultsFromSql.ToList())
            {
                res.timeTaken = res.CreatedOn; /*= SqlFunctions.DateDiff("day", res.UpdatedOn, res.CreatedOn)#1#
            }

如果我之后运行 foreach,我将无法为任何属性分配值,因为匿名类型是只读的。如何获得剩余小时数(最多 24 天)、分钟数(最多 60 天)和秒数(最多 60 天)的天数(全天值,而不是一个月的剩余部分,即 197 天)。

【问题讨论】:

  • 使用“dd”或“d”作为日期的第一个参数。见msdn.microsoft.com/en-us/library/ms174420.aspx
  • @Kevin 谢谢你,但是小时、分钟和秒等以及如何在 Linq 查询或 foreach 中完成这一切
  • 我可能会使用 foreach 和 TimeSpans,但这可能对您有用,也可能不适用。取决于您的 WorkItem 对象中的类型。

标签: c# sql linq foreach


【解决方案1】:

仔细看看你在做什么,试试这个:

var resultsFromSql = from wb in reportContext.WorkItems
                         where wi.DateRequired >= model.FirstDate && wi.DateRequired <= model.SecondDate
                         select new
                         {
                             wi.Reference,
                             dateRequired = wi.DateRequired.ToString("yyyy/mm/dd"),
                             earliestActionDate = wi.EarliestActionDate.ToString("yyyy/mm/dd"),
                             mainRef = wi.MainReferenceId != 0 ? wi.MainReferenceId.ToString() : " ",
                             subRef = wi.SecondaryReference ?? "",
                             details = wi.DisplayDetails ?? "",
                             createdOn = wi.CreatedOn.ToString("yyyy/mm/dd"),
                             updatedOn = wi.UpdatedOn.ToString("yyyy/mm/dd"),
                             timeTaken = new TimeSpan(wi.UpdatedOn.Ticks - wi.CreatedOn.Ticks).Days.ToString() + " days " +
                                            new TimeSpan(wi.UpdatedOn.Ticks - wi.CreatedOn.Ticks).Hours.ToString() + ":" +
                                            new TimeSpan(wi.UpdatedOn.Ticks - wi.CreatedOn.Ticks).Minutes.ToString() + ":" +
                                            new TimeSpan(wi.UpdatedOn.Ticks - wi.CreatedOn.Ticks).Seconds.ToString()
                         };

刚刚在编辑器中输入了这个,您可能需要稍微调整一下。这假定 wi.DateRequired、wi.EarliestActionDate、wi.CreatedOn 和 wi.UpdatedOn 是 DateTime 类型。还假设 timeStuff 是实验性的(试图让它工作)并将其删除。

【讨论】:

    【解决方案2】:
    public string ConvertToDayHourMinSec(DateTime firstTime, DateTime secondTime)
        {
            var timeTaken = new TimeSpan(firstTime.Ticks - secondTime.Ticks);
            var days = timeTaken.ToString("%d"); 
            var hms = timeTaken.ToString(@"hh\:mm\:ss");
            return days + " days, " + hms;
        }
    

    感谢@Kevin 的回答让我走上了正确的道路。代码对于内联使用来说有点重,所以我创建了上面的函数,可以用任何 dateTime 调用,即

    UpdatedMinusCreated = ConvertToDayHourMinSec(res.UpdatedOn, res.CreatedOn),
    

    并给出格式4 days, 03:07:42

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-12
      • 1970-01-01
      • 1970-01-01
      • 2012-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多