1

我收到一个 MySql 数据库,其中一个表有一个字符串格式的 Date 列,现在我需要使用 Pomelo 和 EF Core 构建一个 .Net 核心服务器,并且要求我的服务器可以在一个日期范围内从该表中查询数据,但由于该表的日期列是字符串格式,所以我不知道如何查询它,请帮助。谢谢!

4

3 回答 3

0

如何在mysql中将字符串转换为日期?

正如这里所说

您可以查询字符串到日期

SELECT  STR_TO_DATE(yourdatefield, '%m/%d/%Y')
FROM    yourtable
于 2020-09-10T16:32:30.490 回答
0

您必须将该字符串转换为日期才能查询它。

我可能会在表中添加一个新的日期时间列,然后创建一个简单的控制台应用程序来读取每个字符串日期,尝试将其解析为日期时间并将其保存到新的日期时间列。

然后您应该查看有多少行具有有效的日期时间并更正其他行

最后,您可以使用实体框架进行查询

于 2020-09-10T16:24:56.493 回答
0

随着数据库架构更改

如果您可以(即被允许)更改相关表的架构,则只需添加一个新列datetimedate列,将数据从旧列复制到新列,然后删除该列:

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 回答