Skip to content

Instantly share code, notes, and snippets.

@ronnieoverby
Last active August 29, 2015 14:08
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ronnieoverby/30b3e96d2e585352a855 to your computer and use it in GitHub Desktop.
Save ronnieoverby/30b3e96d2e585352a855 to your computer and use it in GitHub Desktop.
[Test]
public async void Sqlite_Orders_And_Returns_DateTimeOffsets_Correctly()
{
using (var db = DatabaseBuilder.BuildDatabase())
{
db.ExecuteSql("CREATE TABLE \"Tests\" (\"Time\" TEXT NOT NULL)");
var later = DateTimeOffset.Parse("10/23/2014 11:35:18 AM -04:00").ToLocalTime();
var earlier = later.AddMinutes(-10).ToUniversalTime();
var ordered = new[] {later, earlier}.OrderBy(x => x);
foreach (var dto in ordered)
await db.InsertAsync(new {Time = dto}, "Tests");
// demonstrate improper ordering
var badResults = db.QuerySql("SELECT * FROM \"Tests\" ORDER BY \"Time\"")
.AsEnumerable()
.Select(x => x["Time"].ConvertTo<DateTimeOffset>())
.ToArray();
CollectionAssert.AreEqual(ordered.OrderByDescending(x=>x),badResults);
// must use sqlite datetime() function for ordering
// because sqlite stores the values as strings
// and the ordering of strings is lexicographical
var results = db.QuerySql("SELECT * FROM \"Tests\" ORDER BY datetime(\"Time\")")
.AsEnumerable()
.Select(x => x["Time"].ConvertTo<DateTimeOffset>())
.ToArray();
CollectionAssert.AreEqual(ordered,results);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment