DbFunctions 截断时间返回值

本文关键字:返回值 时间 DbFunctions | 更新日期: 2023-09-27 18:34:38

我的应用程序是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

我怎样才能摆脱多余的零。 表中的数据类型为日期。

DbFunctions 截断时间返回值

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,那么你应该做一个范围查询而不是Distinct

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

TruncateTime 不会做你认为它会做的事情。如果数据库中没有datetime的时间部分,则截断时间不会执行任何操作。那里没有时间开始,截断后也没有时间。

我认为您在这里缺少的是数据结构与其人类可读表示之间的区别。 TruncateTime函数日期时间类型。此类型用于存储时间和日期。但是,您可以将其用于仅存储日期或仅存储时间。

除了这一行什么也没做之外,您没有提供任何代码,并且您模糊地提到了"下拉列表"的一些时间。因此,您很难回答您的问题。我还是会努力的。不过,对于未来,它有助于提供所有相关代码(但没有(不相关的代码,因为没有人喜欢滚动浏览代码页面。

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

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

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

根据你的实现,你可能还需要在用户从控件中选择某些内容后执行从stringDateTime的反向转换,并且你希望将选择的结果以DateTime格式传达回代码。

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

您使用的是 SQL Server,则可以使用 SqlFunctions 静态类。如果你不想要额外的零,你可以使用SqlFunctions.DatePart

替换以下代码:

Date = DbFunctions.TruncateTime(c.Date)

使用此代码:

Date = SqlFunctions.DatePart("yyyy", c.Date) + "-" + SqlFunctions.DatePart("mm", c.Date) + "-" + SqlFunctions.DatePart("dd", c.Date)