C# DbFunctions截断时间返回值
我的应用程序是MVC5、EF6.1和SQL Server。 我正在使用C# DbFunctions截断时间返回值,c#,sql-server,asp.net-mvc,entity-framework,C#,Sql Server,Asp.net Mvc,Entity Framework,我的应用程序是MVC5、EF6.1和SQL Server。 我正在使用 public JsonResult GetUserDates() { var id= "1231231234"; var data = db.Test.Where(x => x.Id == id).Select(c => new { Date = DbFunctions
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);
}
它返回正确的日期,但在dropdownlist中,它如下所示:
2016-1-12 00:00:00:00000000
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);
}
我怎样才能去掉多余的零呢。表中的数据类型是date。如果您使用的是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)
不会做你认为会做的事。如果数据库中没有datetime
的时间部分,则截断时间不会起任何作用。没有时间开始,截断后也没有时间
我认为这里缺少的是数据结构和它的人类可读表示之间的差异<代码>截断时间函数类型。此类型用于存储时间和日期。但是,您可以使用它只存储日期或时间
您没有提供任何代码,除了这一行什么都没有,您模糊地提到了“dropdownlist”的某个时间。这样你就很难回答你的问题了。我还是会努力的。但在将来,它有助于提供所有相关的代码(但没有一个是不相关的),因为没有人喜欢滚动代码页
很可能您正试图在某种控件中使用数据库中的日期。您可能正在将控件绑定到结果集。这些是能够回答你的问题的关键,但你没有提供它们
许多控件将接受绑定到它们的任何对象,并将使用的(子)实现将对象转换为字符串以在控件中显示。默认情况下,形成一个同时包含时间和日期的字符串。这可能就是你所看到的
根据您的实现,您可能需要使用ToString的函数显式地将其转换为字符串。您可以使用它为输出字符串指定精确的格式,也就是说,您可以很容易地从输出中省略时间
根据您的实现,在用户从控件中选择某项内容后,您可能还需要执行从string
到DateTime
的反向转换,并且您希望以DateTime
格式将选择结果传回代码
阅读内容:字符串格式、数据绑定、方法重载、继承、多态性 CodeNotFound的解决方案是可以接受的,但您也可以在.NET而不是SQL中构建字符串,如下所示:
2016-1-12 00:00:00:00000000
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,则:
此外,我将结果保存在您提供的相同结构中,但是您可能会发现返回日期字符串数组比返回包含“日期”字段的对象数组更容易。想一想
我还要说,这是一个很好的解决方案,因为您提供了两个重要的细节:
datetime
、datetime2
、smalldatetime
或datetimeoffset
,那么您可能希望执行范围查询,而不是不同的
JsonResult
,它通常使用难看的“/Date()/”
格式序列化DateTime
,其中
是自1970-01-01T00:00:00Z
以来的类unix时间毫秒数。但是,由于您使用的是日期,而不是日期时间,因此使用此格式可能会导致浏览器将日期解释为UTC午夜,并且对于某些时区,可能会转移到午夜的另一侧,从而产生不同的日期。因此,以ISO-8601格式(yyyy-MM-dd
)发送字符串是一种更好的方法如何去掉多余的零
您的示例中有多少多余的零?对于2016-1-1**0**00:00:00:00000000
?您使用的是实体框架吗?是的,我使用的是EF 6.1,如我的问题中所示的额外零,它们看起来像时间!所以你只想要Datetime类的date部分?问题更改……是的,我正在使用SQL server,希望删除多余的零。sql中的数据类型为日期。谢谢你谢谢安德鲁花时间解释。你说得对,我应该解释得更多。我正在使用击倒剑道下拉列表。谢谢你,马特,非常有用。但是我得到了一个错误:CS1501方法“ToString”的无重载包含2个参数,所以我使用了Date=x.Value.ToShortDateString(),我工作得很好。Hmmm。。是的。您不希望将转换为PortDateString
,因为这是特定于文化的,例如今天在美国是“2/13/2016”
,或者在世界其他地区是“13/2/2016”
。对于JSON,您确实应该坚持使用ISO8601,“2016-02-13”
。您的测试日期是否定义为DateTime
或DateTime?
公共可空日期,与DateTime?
相同。我更新了答案来解释这一点。