簡體   English   中英

如何按月和年獲取 ROOM 數據庫中的某些行

[英]How do I get certain row in ROOM Database by month and year

我有一張表,我在其中放了很長的日期,當我將它轉換回字符串時,它將是“dd/mm/yyyy”。 我想用月份和年份獲取某些數據,所以自定義查詢如下:

SELECT id FROM things 
   WHERE MONTH(happened_at) = 1 AND YEAR(happened_at) = 2009;

示例表的數據如下:

id happend_at
-- ----------------
1  2009-01-01 12:08
2  2009-02-01 12:00
3  2009-01-12 09:40
4  2009-01-29 17:55

我想知道如何獲取發生在 long 中的數據,而不是上面示例中的 String。

我目前正在學習使用 java 和房間數據庫制作 android 應用程序,所以我制作了一個轉換器來將日期轉換為長。 轉換器是這樣的:

import androidx.room.TypeConverter;
import java.util.Date;  
public class DateConverter {     
    @TypeConverter
         public static Date fromTimestamp(Long value) 
         {         return value == null ? null : 
            new Date(value);     
         }      
    @TypeConverter 
        public static Long dateToTimestamp(Date date) 
        {
                 return date == null ? null : 
                 date.getTime();
        } 
}

嘗試使用:-

SELECT id FROM things WHERE CAST(strftime('%m',happened_at / 1000,'unixepoch') AS INTEGER) = 1 AND CAST(strftime('%Y',happened_at / 1000,'unixepoch') as INTEGER) = 2009;

這是有效的,因為: -

  • 該值將根據 TypeConverter 存儲為包含毫秒的值

  • Java Date class 的getTime()方法返回自 1970 年 1 月 1 日 00:00:00 GTM 以來的毫秒數,由 Date ZA8CFDE6331BD59EB42AC96F8911C 表示。

  • 除以 1000 去除毫秒,然后是 Unix_Time 值(自 1970 年 1 月 1 日 00:00:00 以來的秒數)。

  • strftime是 SQLite 的日期/時間 function 可用於從識別類型轉換/格式化日期(見鏈接第 2 節)

unix_epoch修飾符讓 SQLite strftime function 區分數字是儒略日(沒有“unixepoch”修飾符)還是 Z6EC1BD1EA6A5D67A63B20C8F6172BDDDDDDDDD 修飾符。

  • '%m'以字符串形式檢索月份,前面用 0 填充以始終為 2 個字符, '%Y'表示年份部分。

  • https://www.sqlite.org/lang_datefunc.html

  • 如果結果存在, CAST表達式會從結果中去除前面的 0,即將 01 轉換為 1。

    • 使用 CAST 的替代方法可能是強制 integer(而不是字符串)值,例如通過添加 0 例如SELECT id FROM things WHERE 0 + strftime('%m',happened_at / 1000,'unixepoch') = 1 AND 0 + strftime('%Y',happened_at / 1000,'unixepoch') = 2009;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM