繁体   English   中英

如何在联接表时从DateTime获取没有时间的Date

[英]How to get Date without Time from DateTime while join tables

我正在加入三张桌子,我想得到没有时间的日期。

var query = from anObjective in db.Objective
    join anObjectiveType in db.ObjectiveType 
               on anObjective.IdType equals anObjectiveType.IdObjectiveType
    join statusCode in db.StatusCode 
               on anObjective.IdStatusCode equals statusCode.IdStatus
    select new
    {
          IdObjective = anObjective.IdObjective,
          ObjectiveName = anObjective.ObjectiveName,
          DateCreation = anObjective.DateCreation, //get just Date without time
          DateEnd = anObjective.DateEnd,  //get just Date without time

    };

我知道有一个方法DbFunctions.TruncateTime ,但是它返回零值的时间。 但是我想得到没有时间的约会。

我也看到了这个答案 ,但是我无法弄清楚加入而不是分组时的申请方法。

型号类别:

public partial class Objective
{
    public int IdObjective { get; set; }
    public string ObjectiveName { get; set; }
    public Nullable<System.DateTime> DateCreation { get; set; }
    public Nullable<System.DateTime> DateEnd { get; set; }    
}

如何不带时间获取诸如anObjective.DateCreationanObjective.DateEnd属性的Date值?

我理想的结果就是Date:1.9.2016

编辑:
如果我编写以下语法:

DateCreation =anObjective.DateCreation.Date,
//or
DateCreation =null ? default(DateTime?) :  anObjective.DateCreation.Date,

然后我有一个这样的例外:

'System.Nullable'不包含'Date'的定义,找不到扩展方法'Date'接受类型为'System.Nullable'的第一个参数(您是否缺少using指令或程序集引用?)


如果我写:

DateCreation =anObjective.DateCreation.Value.ToShortDateString(),
anObjective.DateEnd.Value.ToShortDateString(),

然后我有一个这样的例外:

LINQ to Entities无法识别方法'System.String ToShortDateString()',并且该方法无法转换为商店表达式

如果我写:

DateCreation =anObjective.DateCreation.Value.Date,

然后我有一个这样的例外:

LINQ to Entities不支持指定的类型成员'Date'。 仅支持初始化程序,实体成员和实体导航属性。

首先,认识到.NET中没有日期的日期没有内置类型。 至少还没有 因此,如果只想使用日期,则需要使用某种特定格式的字符串。

您将无法获得LINQ查询的基础提供程序来了解DateTimestring的转换。 因此,您需要查询原始格式的数据, 然后在查询结果实现后将其转换为字符串。

从原始查询开始,原始查询与问题顶部显示的内容相同。 然后添加以下内容:

var results = query.AsEnumerable().Select(x=>
new
{
    IdObjective = x.IdObjective,
    ObjectiveName = x.ObjectiveName,
    DateCreation = x.DateCreation.ToShortDateString(),
    DateEnd = x.DateEnd.ToShortDateString()
});

您还可以选择:

  • 如果知道要使用ListArray ,则可以使用ToList()ToArray()代替AsEnumerable()

  • 如果您希望结果字符串采用特定格式或使用特定区域性,则可以使用ToString代替ToShortDateString

例如,您可能想要一个包含标准ISO-8601日期字符串的数组,并且当当前区域性使用非格里高利历系统时,您可能希望使用不变区域性以避免副作用。

var results = query.ToArray().Select(x=>
new
{
    IdObjective = x.IdObjective,
    ObjectiveName = x.ObjectiveName,
    DateCreation = x.DateCreation.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture),
    DateEnd = x.DateEnd.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture)
});

添加“ .Date”

   anObjective.DateEnd.Date
   anObjective.DateCreation.Date

我在想什么 DateTime只是一个整数。 两者相减至午夜,它们将相等。

DateTime epoch = new DateTime(1970,1,1,0,0,0);
int dateCreationInt = Math.Floor(dateCreation.Subract(epoch).TotalSeconds/86400);
int dateEndInt = Math.Floor(dateEnd.Subract(epoch).TotalSeconds/86400);

或者更好:

 DateTime epoch = new DateTime(1970,1,1,0,0,0);
int dateCreationInt = Math.Floor(dateCreation.Subract(epoch).TotalDays);
int dateEndInt = Math.Floor(dateEnd.Subract(epoch).TotalDays);

如果需要DateTime,只需将整数重新转换为datetime-它们仍将等于午夜,因此将被评估为“等于”:

 dateEnd = epoch.AddDays(dateCreationInt);
 dateCreation = epoch.AddDays(dateEndInt);

现在,如果两个日期都在同一日期(无论时间如何)都将匹配。

全部放在一起

 DateTime epoch = new DateTime(1970,1,1,1);
 select new
{
      IdObjective = anObjective.IdObjective,
      ObjectiveName = anObjective.ObjectiveName,
      DateCreation = epoch.AddDays(anObjective.DateCreation.Subtract(epoch).TotalDays),
      DateEnd = epoch.AddDays(anObjective.DateEnd.Subtract(epoch).TotalDays)

};

看来您需要首先使用.Value,因为它是可空的DateTime。 看到这个答案:

为C#中的系统可空日期时间(datetime?)获取短日期

之后,您应该可以使用与getshortdatestring不同的方式来获取格式化的日期。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM