C# DbFunctions截断时间返回值

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

我的应用程序是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.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,则:

此外,我将结果保存在您提供的相同结构中,但是您可能会发现返回日期字符串数组比返回包含“日期”字段的对象数组更容易。想一想

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

  • SQL中的数据字段是日期类型。如果它实际上是一个
    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?
    相同。我更新了答案来解释这一点。