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
我怎样才能摆脱多余的零。 表中的数据类型为日期。
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"字段的对象数组更容易。 要考虑的事情。
我还要说,这只是一个很好的解决方案,因为您提供了两个重要细节:
SQL 中的数据字段是
date
类型。 如果它实际上是一个datetime
、datetime2
、smalldatetime
或datetimeoffset
,那么你应该做一个范围查询而不是Distinct
。结果进入一个
JsonResult
,它通常会使用丑陋的"/Date(<ts>)/"
格式序列化DateTime
,其中<ts>
是自1970-01-01T00:00:00Z
年以来类似unix时间的毫秒数。 但是,由于您使用的是日期而不是日期时间,因此使用此格式可能会导致浏览器将日期解释为 UTC 午夜,并且在某些时区可能会移动到午夜的另一侧,从而导致不同的日期。 因此,发送ISO-8601格式(yyyy-MM-dd
(的字符串是一种更好的方法。
TruncateTime 不会做你认为它会做的事情。如果数据库中没有datetime
的时间部分,则截断时间不会执行任何操作。那里没有时间开始,截断后也没有时间。
我认为您在这里缺少的是数据结构与其人类可读表示之间的区别。 TruncateTime
函数日期时间类型。此类型用于存储时间和日期。但是,您可以将其用于仅存储日期或仅存储时间。
除了这一行什么也没做之外,您没有提供任何代码,并且您模糊地提到了"下拉列表"的一些时间。因此,您很难回答您的问题。我还是会努力的。不过,对于未来,它有助于提供所有相关代码(但没有(不相关的代码,因为没有人喜欢滚动浏览代码页面。
您很可能正在尝试在某种控件中使用数据库中的日期。您可能正在将数据控件绑定到结果集。这些是能够回答您的问题但您没有提供它们的关键事项。
许多控件将接受绑定到它们的任何对象,并将使用 ToString 的 (子( 实现将对象转换为字符串以在控件中显示。默认情况下,DateTime.ToString 形成一个同时包含时间和日期的字符串。这可能就是你所看到的。
根据您的实现,您可能需要使用 ToString 的重载将其显式转换为字符串。您将能够使用它为输出字符串指定精确的格式,也就是说,您可以轻松地从输出中省略时间。
根据你的实现,你可能还需要在用户从控件中选择某些内容后执行从string
到DateTime
的反向转换,并且你希望将选择的结果以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)