Отметка времени EFCore Postgres теряет тиковую точность - PullRequest
0 голосов
/ 20 сентября 2019

У меня проблема с моим приложением, которое читает из JSON API, который предоставляет мне время в формате UTC в следующем формате:

2019-09-19T23:46:00.1183275Z

Я храню этираз в базе данных Postgres, используя Entity Framework Core и позже, чтобы убедиться, что я получаю только новые данные из API.Проблема, с которой я сталкиваюсь, заключается в том, что, когда эти временные метки записываются в базу данных, я теряю точность, которой обладает .NET, вплоть до отметок временной метки.C # имеет отметки для вышеуказанной отметки времени как: 637045335601183275, но когда я читаю то же самое время обратно из базы данных, отметки 637045335601183270.

Я попытался найти документацию, но не смог найтиспособ изменить точность отметки времени в базе данных.Есть ли способ?В противном случае существует ли согласованный способ округлить DateTime с точностью, которая не будет потеряна базой данных?

Пример:

Контекст

public class MyContext : DbContext
{
    public DbSet<Item> Items { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseNpgsql(@"host=localhost;port=5432;database=TestDb;user id=postgres;password=password");
    }
}

Элемент

public class Item
{
    public int Id { get; set; }
    public DateTime CreateTime { get; set; }
}

Программа

class Program
{
    static void Main(string[] args)
    {
        var item = JsonConvert.DeserializeObject<Item>("{Id: 1, CreateTime: \"2019-09-19T23:46:00.1183275Z\"}");
        Item readItem;

        using(var context = new MyContext())
        {
            context.Items.Add(item);
            context.SaveChanges();
        }

        using(var context = new MyContext())
        {
            readItem = context.Items.First();
        }

        Console.WriteLine(item.CreateTime.Ticks.Equals(readItem.CreateTime.Ticks)); //Outputs False
    }
}

Выше создано с помощью EFCore 2.2.6 и Npgsql.EntityFrameworkCore.PostgreSQL 2.2.4

1 Ответ

1 голос
/ 20 сентября 2019

Я попытался найти документацию, но не смог найти способ изменить точность отметки времени в базе данных.Есть ли способ?

Нет, нет.

Типы даты / времени Postgres, увы, точны только от до микросекунды (1/1 000 000 секунд).

.NET даты измеряются в 100 наносекундах единицах, называемых тиками (тик составляет 1/10 000 000 секунд).

Поскольку на каждую микросекунду приходится 10 тиков,Чистые даты не будут округляться через Postgres.

Если нет последовательного способа округлить DateTime с точностью, которая не будет потеряна базой данных?

Да - DateTime имеет конструктор, который принимает Ticks.Таким образом, вы можете использовать item.CreateTime.Ticks, чтобы получить исходное значение тиков, изменить его каким-либо образом (решить, хотите ли вы потолок, пол, круг или что-то еще), а затем передать его конструктору.Это значение (с точностью до микросекунды) будет в порядке и выше через Postgres.

...