仅在数据库中存储日期而不是时间部分 C#

Posted

技术标签:

【中文标题】仅在数据库中存储日期而不是时间部分 C#【英文标题】:store only date in database not time portion C# 【发布时间】:2016-02-19 03:21:37 【问题描述】:

我有一个测试类和一个 ExecutionDate 属性,它只存储日期,但是当我们使用 [DataType(DataType.Date)] 时,它也将时间部分存储在数据库中,但我只想要日期部分。

public class Test

     [Key]
     public int Id  get; set; 

     [DataType(DataType.Date)]
     public DateTime ExecutionDate  get; set;       

有什么方法可以使用实体框架在 db 中仅存储时间部分的日期吗?请帮帮我....

我在使用 [DataType(DataType.Date)] 时添加了存储时间部分 00:00 的快照,我想删除它

【问题讨论】:

那么,你的数据库表中列的datatype是什么?如果您的数据库中的列是DATETIME - 那么您当然会得到存储的日期和时间。 数据库列必须是数据类型DATE——不仅仅是你在C#类上的属性! 将您的数据库列设为DATE 这更多的是观看问题而不是存储问题。即使时间部分设置为空,日期时间也是日期时间。显示表格内容的工具仅显示日期时间的默认格式。如果您不想看到时间部分,请更改用于查看数据库内容的工具的设置。 您只能在数据库级别使用DATE - 在 .NET 和实体框架中,我们没有特定的“仅限日期”数据类型。在 .NET 代码中,您总是 有日期和时间 - 无法更改。但在 SQL Server 数据库表中,您可以将其设为 DATE 并仅存储日期 您的数据库是如何创建的?如果您遵循 Code First 并从您的代码生成数据库,那么您必须在该属性上添加 Column(TypeName="date") 属性。 【参考方案1】:

我认为您正在尝试指定数据库列类型。您可以使用this 文章中描述的数据注释。

这是一个例子:

[Table("People")]
public class Person

    public int Id  get; set; 

    [Column(TypeName = "varchar")]
    public string Name  get; set; 

    [Column(TypeName="date")]
    public DateTime DOB  get; set; 

默认情况下,字符串被转换为 nvarchar,我们在这里进行了更改。此外,默认情况下映射到 sql server 中的数据时间的 Datetime(这是你问的)更改为 date,它仅存储日期部分而不是 DateTime 值的时间部分。

【讨论】:

【参考方案2】:

在 EF 核心上,可以在 DbContext 类中添加覆盖 OnModelCreating。

protected override void OnModelCreating(ModelBuilder builder)
        
            builder.Entity<Test>().
                Property(p => p.ExecutionDate)
                .HasColumnType("date");
        

【讨论】:

这是否与特定的数据库引擎相关联?【参考方案3】:

正如 David 上面所说,一旦您将该数据带入应用程序,它将是一个 DateTime,并在日期上添加了时间戳。如果您将日期存储为字符串并使用 Convert 更改为 DateTime 以进行任何操作,这也将是相同的结果:

string date = "2015-11-17";
var dateTime = Convert.ToDateTime(date);

除非您想在应用程序中操作字符串以避免时间戳,否则您只能使用 DateTime。不过,出于显示目的,您始终可以格式化日期并删除时间戳:

var dateTime = DateTime.Now;
var formatDate = dateTime.ToString("yyyy-MM-dd");

【讨论】:

【参考方案4】:

在 .NET 6 中,您现在有了新的特殊类型 - DateOnly

更多信息在这里: https://github.com/dotnet/efcore/issues/24507 https://www.stevejgordon.co.uk/using-dateonly-and-timeonly-in-dotnet-6

【讨论】:

【参考方案5】:

将数据库上的数据类型从 Datetime 更改为 Date 类型

这对你来说真的是个问题吗?你可能想在某个时候呆在那里,

【讨论】:

投反对票有什么特别的理由吗?他只想将 DATE 存储在数据库中,并且有一个 DATE 类型可以做到这一点,哈哈【参考方案6】:

在数据库中将 DateTime 更改为 nvarchar(10) 如果你在数据库中使用 DateTime 00.00.00 将由数据库自动分配

string date = DateTime.Today.ToShortDateString();

【讨论】:

以上是关于仅在数据库中存储日期而不是时间部分 C#的主要内容,如果未能解决你的问题,请参考以下文章

仅在 MySQL 列中自动标记日期

UIDatePicker 仅在核心数据中存储时间

在CTE中使用最大递归来生成CTE,而不是仅在最终的SELECT语句中生成CTE

按日期而不是按工作周显示 MYSQL C#

仅在非空列上的 case 语句

如何使单元格仅在填充后才能读取?数据网格视图 C#