DbFunctions TruncateTime返回值

时间:2016-02-13 21:29:46

标签: c# sql-server asp.net-mvc entity-framework

我的应用程序是MVC 5,EF 6.1和SQL Server。 我正在使用

 public JsonResult GetUserDates()
        {
            var id= "1231231234";
            var data = db.Test.Where(x => x.Id == id).Select(c =>
            new
            {
                Date = DbFunctions.TruncateTime(c.Date)}).Distinct().ToList();
   return Json(data, JsonRequestBehavior.AllowGet);
        }

它返回日期正确但是在下拉列表中它看起来像这样:

2016-1-12 00:00:00:00000000

如何摆脱额外的零点。表中的数据类型是日期。

3 个答案:

答案 0 :(得分:3)

CodeNotFound的解决方案是可以接受的,但是,您可以在.NET中而不是在SQL中构建字符串,如下所示:

public JsonResult GetUserDates()
{
    var id= "1231231234";
    var data = db.Test.Where(x => x.Id == id).Select(c => c.Date).Distinct()
                 .AsEnumerable()
                 .Select(x => new { 
                     Date = x.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture)
                 });

    return Json(data, JsonRequestBehavior.AllowGet);
}

在将查询结果从SQL Server返回到.NET之后,将执行.AsEnumerable()之后的任何内容。这稍微好一点,因为数据将以其本机二进制格式在底层TDS协议中发送,而不是字符串。

您没有必要使用最终ToList

请注意,如果您的字段可以为空,因此您将对象声明为DateTime?,那么您将进行微调:

使用C#6 ?.表示法:

Date = x?.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture)

或者如果你还在C#5上,那么:

Date = x == null ? null : x.Value.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture)

另外,我将结果保存在您呈现的相同结构中,但您可能会发现返回日期字符串数组更容易,而不是包含" Date"领域。需要考虑的事情。

我还说,由于您提供了两个重要细节,这只是一个很好的解决方案:

  1. SQL中的数据字段是date类型。如果它实际上是datetimedatetime2smalldatetimedatetimeoffset,那么您可能希望执行范围查询而不是{{ 1}}。

  2. 结果进入Distinct,通常会使用丑陋的JsonResult格式序列化DateTime,其中"/Date(<ts>)/"是unix-time-像<ts>以来的毫秒数。但是,由于您使用的是日期而不是日期时间,因此使用此格式可能会导致浏览器将日期解释为UTC午夜,并且某些时区可能会转移到午夜的另一侧,从而导致结果在另一个日期。因此,以ISO-8601格式(1970-01-01T00:00:00Z)发送字符串是一种更好的方法。

答案 1 :(得分:2)

您正在使用SQL Server,然后您可以使用 SqlFunctions 静态类。如果您不想要额外的零,可以使用 SqlFunctions.DatePart

替换以下代码:

 cat numbers | sort -t. -k 1,1n -k 2,2n -k 3,3n -k 4,4n

使用此代码:

Date = DbFunctions.TruncateTime(c.Date)

答案 2 :(得分:2)

TruncateTime不会按照您的想法行事。如果您的数据库中没有datetime的时间部分,则截断时间不会执行任何操作。没有时间开始,截断后没有时间。

我认为你在这里缺少的是数据结构与人类可读表示之间的区别。 TruncateTime函数DateTime类型。此类型用于存储Time Date。但是,您可以使用它来存储日期或时间。

除了没有实现任何结果的单一行之外,你不提供任何代码,而且你在“下拉列表”中隐约提到了一些时间。因此,你很难回答你的问题。我还是会试试。然而,对于未来,它有助于提供所有相关的代码(但没有),因为没有人喜欢滚动代码页。

您很可能尝试在某种控件中使用数据库中的日期。您可能正在将控件绑定到结果集。这些是能够回答你的问题但你没有提供它们的关键事项。

许多控件会接受绑定到它们的任何对象,并将使用ToString的(子)实现将对象转换为字符串以在控件中显示。默认情况下,DateTime.ToString形成一个包含时间日期的字符串。这可能就是你所看到的。

根据您的实现,您可能需要使用ToString的this overload将其显式转换为字符串。您可以使用它来指定输出字符串的精确格式,也就是说您可以轻松省略输出的时间。

根据您的实施情况,您可能还需要在用户从您的控件中选择内容后,从stringDateTime进行反向转换,并且您希望将选择的结果传达给您的DateTime格式的代码。

阅读内容:字符串格式,数据绑定,方法重载,继承,多态性。