{"id":21011823,"url":"https://github.com/khellang/efcore.sqlite.nodatime","last_synced_at":"2025-06-30T14:03:37.633Z","repository":{"id":46156112,"uuid":"322074784","full_name":"khellang/EFCore.Sqlite.NodaTime","owner":"khellang","description":"Adds support for NodaTime types when using SQLite with Entity Framework Core.","archived":false,"fork":false,"pushed_at":"2023-12-05T14:56:42.000Z","size":151,"stargazers_count":28,"open_issues_count":1,"forks_count":8,"subscribers_count":2,"default_branch":"master","last_synced_at":"2023-12-05T15:31:42.244Z","etag":null,"topics":["c-sharp","database","dotnet","dotnet-core","entity-framework","nodatime","nodatime-types","orm","sqlite"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/khellang.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2020-12-16T18:56:57.000Z","updated_at":"2023-11-03T14:16:33.000Z","dependencies_parsed_at":"2023-12-05T15:30:29.439Z","dependency_job_id":"283818aa-f6fd-496a-bc6a-6cf8048004a2","html_url":"https://github.com/khellang/EFCore.Sqlite.NodaTime","commit_stats":null,"previous_names":[],"tags_count":8,"template":null,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/khellang%2FEFCore.Sqlite.NodaTime","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/khellang%2FEFCore.Sqlite.NodaTime/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/khellang%2FEFCore.Sqlite.NodaTime/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/khellang%2FEFCore.Sqlite.NodaTime/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/khellang","download_url":"https://codeload.github.com/khellang/EFCore.Sqlite.NodaTime/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":225326555,"owners_count":17456966,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["c-sharp","database","dotnet","dotnet-core","entity-framework","nodatime","nodatime-types","orm","sqlite"],"created_at":"2024-11-19T09:31:29.228Z","updated_at":"2025-06-30T14:03:37.578Z","avatar_url":"https://github.com/khellang.png","language":"C#","readme":"# EFCore.Sqlite.NodaTime\n\n![Build](https://github.com/khellang/EFCore.Sqlite.NodaTime/workflows/Build/badge.svg)\n\nAdds support for [NodaTime](https://github.com/nodatime/nodatime) types when using [SQLite](https://sqlite.org/) with [Entity Framework Core](https://github.com/dotnet/efcore).\n\n## Installation\n\n[![NuGet](https://img.shields.io/nuget/v/EntityFrameworkCore.Sqlite.NodaTime)](https://www.nuget.org/packages/EntityFrameworkCore.Sqlite.NodaTime)\n\nInstall the latest package from [NuGet](https://www.nuget.org/packages/EntityFrameworkCore.Sqlite.NodaTime).\n\n## Getting Started\n\nIf you're using Entity Framework Core without Dependency Injection, you can call `UseNodaTime` inside the `OnConfiguring` method in your `DbContext` class:\n\n```csharp\npublic class MyDbContext : DbContext\n{\n    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)\n    {\n        optionsBuilder.UseSqlite(\"\u003cconnection-string\u003e\", x =\u003e x.UseNodaTime());\n    }\n}\n```\n\nOtherwise, you should call `UseNodaTime` when adding the `DbContext` to your service collection:\n\n```csharp\npublic class Startup\n{\n    public void ConfigureServices(IServiceCollection services)\n    {\n        services.AddDbContext\u003cMyDbContext\u003e(options =\u003e\n            options.UseSqlite(\"\u003cconnection-string\u003e\", x =\u003e x.UseNodaTime()));\n    }\n}\n```\n\nAnd that's it. You can now use NodaTime types in your entities and perform server-side queries on them! :sparkles:\n\n## Supported Types\n\nThe following NodaTime types are currently supported:\n\n| NodaTime Type | SQLite Type | SQLite Format |\n|---------------|-------------|---------------|\n| `Instant` | `TEXT` | `YYYY-MM-DD HH:MM:SS.SSS` |\n| `LocalDateTime` | `TEXT` | `YYYY-MM-DD HH:MM:SS.SSS` |\n| `LocalDate` | `TEXT` | `YYYY-MM-DD` |\n| `LocalTime` | `TEXT` | `HH:MM:SS.SSS` |\n\n# Supported Properties\n\n| NodaTime Property | Generated SQL | Notes |\n|-------------------|--------------|-------|\n| `Year` | `strftime('%Y', \u003ccolumn\u003e)` | The value is cast to `INTEGER` for comparison. |\n| `Month` | `strftime('%m', \u003ccolumn\u003e)` | The value is cast to `INTEGER` for comparison. |\n| `Day` | `strftime('%d', \u003ccolumn\u003e)` | The value is cast to `INTEGER` for comparison. |\n| `Hour` | `strftime('%H', \u003ccolumn\u003e)` | The value is cast to `INTEGER` for comparison. |\n| `Minute` | `strftime('%M', \u003ccolumn\u003e)` | The value is cast to `INTEGER` for comparison. |\n| `Second` | `strftime('%S', \u003ccolumn\u003e)` | The value is cast to `INTEGER` for comparison. |\n| `DayOfYear` | `strftime('%j', \u003ccolumn\u003e)` | The value is cast to `INTEGER` for comparison.|\n| `DayOfWeek` | `strftime('%w', \u003ccolumn\u003e)` | The value is cast to `INTEGER` for comparison. As NodaTime's `IsoDayOfWeek` enum doesn't match SQLite's day of week, additional SQL is emitted to convert `Sunday` to the correct value. |\n| `Date` | `date(\u003ccolumn\u003e)` | |\n| `TimeOfDay` | `strftime('%H:%M:%f', \u003ccolumn\u003e)` | In order to support fractional seconds to fully roundtrip `LocalTime`, a custom format string is used instead of using `time(\u003ccolumn\u003e)`. |\n\n## Supported Methods\n\n| NodaTime Method | Generated SQL |\n|-----------------|---------------|\n| `SystemClock.Instance.GetCurrentInstant()` | `strftime('%Y-%m-%d %H:%M:%f', 'now')` |\n| `LocalDate.PlusYears` | `date(\u003ccolumn\u003e, '+n years')` |\n| `LocalDate.PlusMonths` | `date(\u003ccolumn\u003e, '+n months')` |\n| `LocalDate.PlusWeeks` | `date(\u003ccolumn\u003e, '+n*7 days')` |\n| `LocalDate.PlusDays` | `date(\u003ccolumn\u003e, '+n days')` |\n| `LocalDate.ToDateOnly` | `date(\u003ccolumn\u003e)` |\n| `LocalDate.ToDateTimeUnspecified` | `date(\u003ccolumn\u003e)` |\n| `LocalTime.PlusHours` | `strftime('%H:%M:%f', \u003ccolumn\u003e, '+n hours')` |\n| `LocalTime.PlusMinutes` | `strftime('%H:%M:%f', \u003ccolumn\u003e, '+n minutes')` |\n| `LocalTime.PlusSeconds` | `strftime('%H:%M:%f', \u003ccolumn\u003e, '+n seconds')` |\n| `LocalTime.PlusMilliseconds` | `strftime('%H:%M:%f', \u003ccolumn\u003e, '+0.n seconds')` |\n| `LocalTime.ToTimeOnly` | `strftime('%H:%M:%f', \u003ccolumn\u003e)` |\n| `LocalDateTime.PlusYears` | `strftime('%Y-%m-%d %H:%M:%f',\u003ccolumn\u003e, '+n years')` |\n| `LocalDateTime.PlusMonths` | `strftime('%Y-%m-%d %H:%M:%f',\u003ccolumn\u003e, '+n months')` |\n| `LocalDateTime.PlusWeeks` | `strftime('%Y-%m-%d %H:%M:%f',\u003ccolumn\u003e, '+n*7 days')` |\n| `LocalDateTime.PlusDays` | `strftime('%Y-%m-%d %H:%M:%f',\u003ccolumn\u003e, '+n days')` |\n| `LocalDateTime.PlusHours` | `strftime('%Y-%m-%d %H:%M:%f', \u003ccolumn\u003e, '+n hours')` |\n| `LocalDateTime.PlusMinutes` | `strftime('%Y-%m-%d %H:%M:%f', \u003ccolumn\u003e, '+n minutes')` |\n| `LocalDateTime.PlusSeconds` | `strftime('%Y-%m-%d %H:%M:%f', \u003ccolumn\u003e, '+n seconds')` |\n| `LocalDateTime.PlusMilliseconds` | `strftime('%Y-%m-%d %H:%M:%f', \u003ccolumn\u003e, '+0.n seconds')` |\n| `LocalDateTime.ToDateTimeUnspecified` | `strftime('%Y-%m-%d %H:%M:%f', \u003ccolumn\u003e)` |\n\nWhen these methods are chained, all modifiers will be added to the same function call, like this:\n\n```csharp\ncontext.NodaTime.Select(x =\u003e x.LocalDateTime.PlusMonths(2).PlusDays(2).PlusHours(2).PlusSeconds(2))\n```\n\nResults in the following SQL:\n\n```sql\nSELECT strftime('%Y-%m-%d %H:%M:%f', \"n\".\"LocalDateTime\", '+2 months', '+2 days', '+2 hours', '+2 seconds')\n```\n\n## Sponsors\n\n[Entity Framework Extensions](https://entityframework-extensions.net/?utm_source=khellang\u0026utm_medium=EFCore.Sqlite.NodaTime) and [Dapper Plus](https://dapper-plus.net/?utm_source=khellang\u0026utm_medium=EFCore.Sqlite.NodaTime) are major sponsors and proud to contribute to the development of EFCore.Sqlite.NodaTime.\n\n[![Entity Framework Extensions](https://raw.githubusercontent.com/khellang/EFCore.Sqlite.NodaTime/master/entity-framework-extensions-major-sponsor.png)](https://entityframework-extensions.net/bulk-insert?utm_source=khellang\u0026utm_medium=EFCore.Sqlite.NodaTime)\n\n[![Dapper Plus](https://raw.githubusercontent.com/khellang/EFCore.Sqlite.NodaTime/master/dapper-plus-sponsor.png)](https://dapper-plus.net/bulk-insert?utm_source=khellang\u0026utm_medium=EFCore.Sqlite.NodaTime)\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkhellang%2Fefcore.sqlite.nodatime","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkhellang%2Fefcore.sqlite.nodatime","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkhellang%2Fefcore.sqlite.nodatime/lists"}