我收到一个 MySql 数据库,其中一个表有一个字符串格式的 Date 列,现在我需要使用 Pomelo 和 EF Core 构建一个 .Net 核心服务器,并且要求我的服务器可以在一个日期范围内从该表中查询数据,但由于该表的日期列是字符串格式,所以我不知道如何查询它,请帮助。谢谢!
问问题
367 次
3 回答
0
于 2020-09-10T16:32:30.490 回答
0
您必须将该字符串转换为日期才能查询它。
我可能会在表中添加一个新的日期时间列,然后创建一个简单的控制台应用程序来读取每个字符串日期,尝试将其解析为日期时间并将其保存到新的日期时间列。
然后您应该查看有多少行具有有效的日期时间并更正其他行
最后,您可以使用实体框架进行查询
于 2020-09-10T16:24:56.493 回答
0
随着数据库架构更改
如果您可以(即被允许)更改相关表的架构,则只需添加一个新列datetime
或date
列,将数据从旧列复制到新列,然后删除该列:
ALTER TABLE `YourTable` ADD COLUMN `NewDateColumn` date NOT NULL;
UPDATE `YourTable` SET `NewDateColumn` = STR_TO_DATE(`OldDateColumn`,'%Y-%m-%d');
ALTER TABLE `YourTable` DROP COLUMN `OldDateColumn`;
您可以仅使用 MySQLWorkbench 或命令行工具运行这些语句。当然,您首先使用本地副本测试它们,以查看一切正常。
带值转换器
如果您无法更改表的架构,那么您仍然可以从数据库中查询日期范围,只要数据库中的日期字符串是按字母顺序排序的字符串格式(例如YYYY-MM-DD
)。在这种情况下,您可以在实际应用程序代码中使用值转换器,根本不需要更改数据库:
public class SomeModel
{
public int SomeModelId {get; set;}
public DateTime YourDateProperty {get; set;} // <-- the type you want to use in .NET
}
public class Context : DbContext
{
public virtual DbSet<SomeModel> SomeModels { get; set; }
// ...
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<SomeModel>(
entity =>
{
entity.Property(e => e.YourDateProperty)
.HasColumnType("varchar(255)") // <-- the type it has in the database table
.HasConversion(
v => v.ToString(@"yyyy\-MM\-dd"),
v => DateTime.Parse(v, CultureInfo.InvariantCulture));
});
}
}
// Here is how a sample query in your app would look like:
var query = context.SomeModels
.Where(m => m.YourDateProperty >= new DateTime(2020, 9, 1) &&
m.YourDateProperty < new DateTime(2020, 9, 10))
.ToList();
于 2020-09-10T18:50:05.797 回答