SQLite Query does not return data when “T” is included in datetimes in the WHERE clause

The following query doesn’t return any data:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<code>SELECT "t0"."id" AS "res0", "t0"."time" AS "res1", "t1"."name" AS "res2", "t1"."description" AS "res3", "t1"."type" AS "res4"
FROM "menus" AS "t0"
INNER JOIN "meals" AS "t1"
INNER JOIN "meal_for_menus" AS "t2"
ON (("t2"."menu__id")=("t0"."id")) AND (("t2"."meal__name")=("t1"."name"))
WHERE ("t0"."time") BETWEEN ('2024-08-11T00:00:00') AND ('2024-08-11T23:59:00');
</code>
<code>SELECT "t0"."id" AS "res0", "t0"."time" AS "res1", "t1"."name" AS "res2", "t1"."description" AS "res3", "t1"."type" AS "res4" FROM "menus" AS "t0" INNER JOIN "meals" AS "t1" INNER JOIN "meal_for_menus" AS "t2" ON (("t2"."menu__id")=("t0"."id")) AND (("t2"."meal__name")=("t1"."name")) WHERE ("t0"."time") BETWEEN ('2024-08-11T00:00:00') AND ('2024-08-11T23:59:00'); </code>
SELECT "t0"."id" AS "res0", "t0"."time" AS "res1", "t1"."name" AS "res2", "t1"."description" AS "res3", "t1"."type" AS "res4"
FROM "menus" AS "t0"
INNER JOIN "meals" AS "t1"
INNER JOIN "meal_for_menus" AS "t2"
ON (("t2"."menu__id")=("t0"."id")) AND (("t2"."meal__name")=("t1"."name"))
WHERE ("t0"."time") BETWEEN ('2024-08-11T00:00:00') AND ('2024-08-11T23:59:00');

but the following query does return data:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<code>SELECT "t0"."id" AS "res0", "t0"."time" AS "res1", "t1"."name" AS "res2", "t1"."description" AS "res3", "t1"."type" AS "res4"
FROM "menus" AS "t0"
INNER JOIN "meals" AS "t1"
INNER JOIN "meal_for_menus" AS "t2"
ON (("t2"."menu__id")=("t0"."id")) AND (("t2"."meal__name")=("t1"."name"))
WHERE ("t0"."time") BETWEEN ('2024-08-11 00:00:00') AND ('2024-08-11 23:59:00');
</code>
<code>SELECT "t0"."id" AS "res0", "t0"."time" AS "res1", "t1"."name" AS "res2", "t1"."description" AS "res3", "t1"."type" AS "res4" FROM "menus" AS "t0" INNER JOIN "meals" AS "t1" INNER JOIN "meal_for_menus" AS "t2" ON (("t2"."menu__id")=("t0"."id")) AND (("t2"."meal__name")=("t1"."name")) WHERE ("t0"."time") BETWEEN ('2024-08-11 00:00:00') AND ('2024-08-11 23:59:00'); </code>
SELECT "t0"."id" AS "res0", "t0"."time" AS "res1", "t1"."name" AS "res2", "t1"."description" AS "res3", "t1"."type" AS "res4"
FROM "menus" AS "t0"
INNER JOIN "meals" AS "t1"
INNER JOIN "meal_for_menus" AS "t2"
ON (("t2"."menu__id")=("t0"."id")) AND (("t2"."meal__name")=("t1"."name"))
WHERE ("t0"."time") BETWEEN ('2024-08-11 00:00:00') AND ('2024-08-11 23:59:00');

The difference is the “T” in the datetimes from the first query. I see “T” is supported by SQLite so I don’t understand why the first query doesn’t work.

FWIW, this query was generated by beam-sqlite.

I’ll try to execute a raw query but I wish I could keep the query generated by beam:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<code>todaysMenu :: Connection -> Day -> IO [(Menu, Meal)]
todaysMenu conn day =
runBeamSqliteDebug putStrLn conn $
runSelectReturningList $
select $
manyToMany_
(_pacomerMealForMenus paComerDb)
_mealformenuMenu
_mealformenuMeal
( filter_
( menu ->
between_
(_menuTime menu)
(val_ $ LocalTime day (TimeOfDay 0 0 0))
(val_ $ LocalTime day (TimeOfDay 23 59 0))
)
(all_ (_pacomerMenus paComerDb))
)
(all_ (_pacomerMeals paComerDb))
</code>
<code>todaysMenu :: Connection -> Day -> IO [(Menu, Meal)] todaysMenu conn day = runBeamSqliteDebug putStrLn conn $ runSelectReturningList $ select $ manyToMany_ (_pacomerMealForMenus paComerDb) _mealformenuMenu _mealformenuMeal ( filter_ ( menu -> between_ (_menuTime menu) (val_ $ LocalTime day (TimeOfDay 0 0 0)) (val_ $ LocalTime day (TimeOfDay 23 59 0)) ) (all_ (_pacomerMenus paComerDb)) ) (all_ (_pacomerMeals paComerDb)) </code>
todaysMenu :: Connection -> Day -> IO [(Menu, Meal)]
todaysMenu conn day =
  runBeamSqliteDebug putStrLn conn $
    runSelectReturningList $
      select $
        manyToMany_
          (_pacomerMealForMenus paComerDb)
          _mealformenuMenu
          _mealformenuMeal
          ( filter_
              ( menu ->
                  between_
                    (_menuTime menu)
                    (val_ $ LocalTime day (TimeOfDay 0 0 0))
                    (val_ $ LocalTime day (TimeOfDay 23 59 0))
              )
              (all_ (_pacomerMenus paComerDb))
          )
          (all_ (_pacomerMeals paComerDb))

Thanks in advance for any explanation about the issue.

The issue you’re encountering with the SQLite query involving the "T" in datetime strings is likely due to how SQLite interprets date and time formats in comparison with the expected formats.

Understanding SQLite Date and Time Formats

SQLite supports several date and time formats, including ISO 8601 (YYYY-MM-DDTHH:MM:SS). However, its support might vary depending on the version and the context in which it is used. The two formats you are using are:

  1. ISO 8601 Format with “T” ('2024-08-11T00:00:00'): This format is valid in SQLite, but if you’re encountering issues, it may be due to how SQLite or the SQL engine you’re using interprets or processes this format in certain contexts.

  2. Space-Separated Format ('2024-08-11 00:00:00'): This format is widely accepted by SQLite for date and time values and is more universally supported in various SQL engines.

Why the Query Might Fail

  1. Parsing Issues: SQLite may have issues parsing the ISO 8601 format with “T” in some contexts, especially if the SQL engine or ORM (like Beam) has its own expectations for date formats.

  2. Version Differences: Different SQLite versions might handle date formats differently. Ensure you are using a version that supports the ISO 8601 format correctly.

  3. SQL Engine or ORM Constraints: The SQL engine or ORM you’re using (in this case, Beam) might have constraints or bugs related to handling ISO 8601 formats.

Solutions

1. Use Space-Separated Format

Since the space-separated format works, it’s generally a good practice to use it for compatibility:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<code>SELECT "t0"."id" AS "res0", "t0"."time" AS "res1", "t1"."name" AS "res2", "t1"."description" AS "res3", "t1"."type" AS "res4"
FROM "menus" AS "t0"
INNER JOIN "meals" AS "t1"
INNER JOIN "meal_for_menus" AS "t2"
ON (("t2"."menu__id")=("t0"."id")) AND (("t2"."meal__name")=("t1"."name"))
WHERE ("t0"."time") BETWEEN ('2024-08-11 00:00:00') AND ('2024-08-11 23:59:00');
</code>
<code>SELECT "t0"."id" AS "res0", "t0"."time" AS "res1", "t1"."name" AS "res2", "t1"."description" AS "res3", "t1"."type" AS "res4" FROM "menus" AS "t0" INNER JOIN "meals" AS "t1" INNER JOIN "meal_for_menus" AS "t2" ON (("t2"."menu__id")=("t0"."id")) AND (("t2"."meal__name")=("t1"."name")) WHERE ("t0"."time") BETWEEN ('2024-08-11 00:00:00') AND ('2024-08-11 23:59:00'); </code>
SELECT "t0"."id" AS "res0", "t0"."time" AS "res1", "t1"."name" AS "res2", "t1"."description" AS "res3", "t1"."type" AS "res4"
FROM "menus" AS "t0"
INNER JOIN "meals" AS "t1"
INNER JOIN "meal_for_menus" AS "t2"
ON (("t2"."menu__id")=("t0"."id")) AND (("t2"."meal__name")=("t1"."name"))
WHERE ("t0"."time") BETWEEN ('2024-08-11 00:00:00') AND ('2024-08-11 23:59:00');

2. Convert ISO 8601 Format to Space-Separated Format

If you prefer using ISO 8601 format, you could try converting it to the space-separated format in your query or code:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<code>-- Convert ISO 8601 to space-separated format
SELECT "t0"."id" AS "res0", "t0"."time" AS "res1", "t1"."name" AS "res2", "t1"."description" AS "res3", "t1"."type" AS "res4"
FROM "menus" AS "t0"
INNER JOIN "meals" AS "t1"
INNER JOIN "meal_for_menus" AS "t2"
ON (("t2"."menu__id")=("t0"."id")) AND (("t2"."meal__name")=("t1"."name"))
WHERE ("t0"."time") BETWEEN (strftime('%Y-%m-%d %H:%M:%S', '2024-08-11T00:00:00')) AND (strftime('%Y-%m-%d %H:%M:%S', '2024-08-11T23:59:00'));
</code>
<code>-- Convert ISO 8601 to space-separated format SELECT "t0"."id" AS "res0", "t0"."time" AS "res1", "t1"."name" AS "res2", "t1"."description" AS "res3", "t1"."type" AS "res4" FROM "menus" AS "t0" INNER JOIN "meals" AS "t1" INNER JOIN "meal_for_menus" AS "t2" ON (("t2"."menu__id")=("t0"."id")) AND (("t2"."meal__name")=("t1"."name")) WHERE ("t0"."time") BETWEEN (strftime('%Y-%m-%d %H:%M:%S', '2024-08-11T00:00:00')) AND (strftime('%Y-%m-%d %H:%M:%S', '2024-08-11T23:59:00')); </code>
-- Convert ISO 8601 to space-separated format
SELECT "t0"."id" AS "res0", "t0"."time" AS "res1", "t1"."name" AS "res2", "t1"."description" AS "res3", "t1"."type" AS "res4"
FROM "menus" AS "t0"
INNER JOIN "meals" AS "t1"
INNER JOIN "meal_for_menus" AS "t2"
ON (("t2"."menu__id")=("t0"."id")) AND (("t2"."meal__name")=("t1"."name"))
WHERE ("t0"."time") BETWEEN (strftime('%Y-%m-%d %H:%M:%S', '2024-08-11T00:00:00')) AND (strftime('%Y-%m-%d %H:%M:%S', '2024-08-11T23:59:00'));

3. Adjust the Beam-SQLITE Query

Modify the todaysMenu function to use the space-separated format:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<code>todaysMenu :: Connection -> Day -> IO [(Menu, Meal)]
todaysMenu conn day =
runBeamSqliteDebug putStrLn conn $
runSelectReturningList $
select $
manyToMany_
(_pacomerMealForMenus paComerDb)
_mealformenuMenu
_mealformenuMeal
( filter_
( menu ->
between_
(_menuTime menu)
(val_ $ LocalTime day (TimeOfDay 0 0 0))
(val_ $ LocalTime day (TimeOfDay 23 59 0))
)
(all_ (_pacomerMenus paComerDb))
)
(all_ (_pacomerMeals paComerDb))
</code>
<code>todaysMenu :: Connection -> Day -> IO [(Menu, Meal)] todaysMenu conn day = runBeamSqliteDebug putStrLn conn $ runSelectReturningList $ select $ manyToMany_ (_pacomerMealForMenus paComerDb) _mealformenuMenu _mealformenuMeal ( filter_ ( menu -> between_ (_menuTime menu) (val_ $ LocalTime day (TimeOfDay 0 0 0)) (val_ $ LocalTime day (TimeOfDay 23 59 0)) ) (all_ (_pacomerMenus paComerDb)) ) (all_ (_pacomerMeals paComerDb)) </code>
todaysMenu :: Connection -> Day -> IO [(Menu, Meal)]
todaysMenu conn day =
  runBeamSqliteDebug putStrLn conn $
    runSelectReturningList $
      select $
        manyToMany_
          (_pacomerMealForMenus paComerDb)
          _mealformenuMenu
          _mealformenuMeal
          ( filter_
              ( menu ->
                  between_
                    (_menuTime menu)
                    (val_ $ LocalTime day (TimeOfDay 0 0 0))
                    (val_ $ LocalTime day (TimeOfDay 23 59 0))
              )
              (all_ (_pacomerMenus paComerDb))
          )
          (all_ (_pacomerMeals paComerDb))

Ensure that the date-time values being generated by LocalTime are in a format that SQLite can handle correctly.

Trang chủ Giới thiệu Sinh nhật bé trai Sinh nhật bé gái Tổ chức sự kiện Biểu diễn giải trí Dịch vụ khác Trang trí tiệc cưới Tổ chức khai trương Tư vấn dịch vụ Thư viện ảnh Tin tức - sự kiện Liên hệ Chú hề sinh nhật Trang trí YEAR END PARTY công ty Trang trí tất niên cuối năm Trang trí tất niên xu hướng mới nhất Trang trí sinh nhật bé trai Hải Đăng Trang trí sinh nhật bé Khánh Vân Trang trí sinh nhật Bích Ngân Trang trí sinh nhật bé Thanh Trang Thuê ông già Noel phát quà Biểu diễn xiếc khỉ Xiếc quay đĩa Dịch vụ tổ chức sự kiện 5 sao Thông tin về chúng tôi Dịch vụ sinh nhật bé trai Dịch vụ sinh nhật bé gái Sự kiện trọn gói Các tiết mục giải trí Dịch vụ bổ trợ Tiệc cưới sang trọng Dịch vụ khai trương Tư vấn tổ chức sự kiện Hình ảnh sự kiện Cập nhật tin tức Liên hệ ngay Thuê chú hề chuyên nghiệp Tiệc tất niên cho công ty Trang trí tiệc cuối năm Tiệc tất niên độc đáo Sinh nhật bé Hải Đăng Sinh nhật đáng yêu bé Khánh Vân Sinh nhật sang trọng Bích Ngân Tiệc sinh nhật bé Thanh Trang Dịch vụ ông già Noel Xiếc thú vui nhộn Biểu diễn xiếc quay đĩa Dịch vụ tổ chức tiệc uy tín Khám phá dịch vụ của chúng tôi Tiệc sinh nhật cho bé trai Trang trí tiệc cho bé gái Gói sự kiện chuyên nghiệp Chương trình giải trí hấp dẫn Dịch vụ hỗ trợ sự kiện Trang trí tiệc cưới đẹp Khởi đầu thành công với khai trương Chuyên gia tư vấn sự kiện Xem ảnh các sự kiện đẹp Tin mới về sự kiện Kết nối với đội ngũ chuyên gia Chú hề vui nhộn cho tiệc sinh nhật Ý tưởng tiệc cuối năm Tất niên độc đáo Trang trí tiệc hiện đại Tổ chức sinh nhật cho Hải Đăng Sinh nhật độc quyền Khánh Vân Phong cách tiệc Bích Ngân Trang trí tiệc bé Thanh Trang Thuê dịch vụ ông già Noel chuyên nghiệp Xem xiếc khỉ đặc sắc Xiếc quay đĩa thú vị
Trang chủ Giới thiệu Sinh nhật bé trai Sinh nhật bé gái Tổ chức sự kiện Biểu diễn giải trí Dịch vụ khác Trang trí tiệc cưới Tổ chức khai trương Tư vấn dịch vụ Thư viện ảnh Tin tức - sự kiện Liên hệ Chú hề sinh nhật Trang trí YEAR END PARTY công ty Trang trí tất niên cuối năm Trang trí tất niên xu hướng mới nhất Trang trí sinh nhật bé trai Hải Đăng Trang trí sinh nhật bé Khánh Vân Trang trí sinh nhật Bích Ngân Trang trí sinh nhật bé Thanh Trang Thuê ông già Noel phát quà Biểu diễn xiếc khỉ Xiếc quay đĩa
Thiết kế website Thiết kế website Thiết kế website Cách kháng tài khoản quảng cáo Mua bán Fanpage Facebook Dịch vụ SEO Tổ chức sinh nhật