我的应用程序是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
如何摆脱额外的零点。表中的数据类型是日期。
答案 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"领域。需要考虑的事情。
我还说,由于您提供了两个重要细节,这只是一个很好的解决方案:
SQL中的数据字段是date
类型。如果它实际上是datetime
,datetime2
,smalldatetime
或datetimeoffset
,那么您可能希望执行范围查询而不是{{ 1}}。
结果进入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将其显式转换为字符串。您可以使用它来指定输出字符串的精确格式,也就是说您可以轻松省略输出的时间。
根据您的实施情况,您可能还需要在用户从您的控件中选择内容后,从string
向DateTime
进行反向转换,并且您希望将选择的结果传达给您的DateTime
格式的代码。
阅读内容:字符串格式,数据绑定,方法重载,继承,多态性。