问题描述
我收到一个MysqL数据库,并且其中一个表具有字符串格式的Date列,现在我需要使用Pomelo和EF Core构建一个.Net核心服务器,并且要求我的服务器可以查询该表中某个范围内的数据日期,但由于该表的“日期”列为字符串格式,因此我不知道如何查询它,请提供帮助。 谢谢!
解决方法
您将必须将该字符串放入日期中才能进行查询。
我可能会在表中添加一个新的datetime列,然后创建一个读取每个字符串日期的简单控制台应用程序,尝试将其解析为一个datetime并将其保存到新的datetime列中。
然后,您应该查看多少行具有有效的日期时间,并更正其他行
最后,您可以使用实体框架进行查询
,how to convert a string to date in mysql?
正如在这里被告知
您可以查询日期字符串
SELECT STR_TO_DATE(yourdatefield,'%m/%d/%Y')
FROM yourtable
,
随着数据库架构的改变
如果可以(即允许)更改相关表的架构,则只需添加新的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
),您仍然可以从数据库中查询日期范围。 。在这种情况下,您只需在实际的应用程序代码中使用value converter,而根本不需要更改数据库:
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,10))
.ToList();