Android Studio 如何按月份和年份获取ROOM数据库中的某行

v9tzhpje  于 2023-03-03  发布在  Android
关注(0)|答案(1)|浏览(180)

我有一个表,我把日期作为长,当我把它转换回字符串,它将是"dd/mm/yyyy"。我想获取某些数据与月和年,所以自定义查询将像这样:

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

示例表具有如下数据:
| 身份证|发生于|
| - ------|- ------|
| 1个|二○ ○九年一月一日十二时零八分|
| 第二章|二○ ○九年二月一日十二时|
| 三个|2009年1月12日09时40分|
| 四个|2009年1月29日17时55分|
我想知道如何像上面的例子那样获取数据,其中happened_at是long格式,而不是String格式。
我目前正在学习使用java和房间数据库制作android应用程序,所以我做了一个转换器来将Date转换为long。转换器是这样的:

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();
        } 
}
fxnxkyjh

fxnxkyjh1#

尝试使用:-

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类的getTime()方法返回自1970年1月1日00:00:00 GTM以来的毫秒数,由Date对象表示。
  • 除以1000将去掉毫秒,这是Unix_Time值(自1970年1月1日00:00:00以来的秒数)。
  • strftime是SQLite的日期/时间函数,可用于从已识别类型转换/格式化日期(参见链接第2节)

unix_epoch修饰符使SQLite strftime函数能够区分儒略日(不带"unixepoch"修饰符)或Unix时间值(带修饰符)。

  • '%m'将月份检索为字符串,前面用0填充,使其始终为2个字符,'%Y'用于年份部分。
  • 参见https://www.sqlite.org/lang_datefunc.html
  • CAST表达式从结果中剥离0之前的值(如果它们存在),即将01转换为1。
  • 使用CAST的一种替代方法是强制使用整数(而不是字符串)值,例如通过添加0,例如SELECT id FROM things WHERE 0 + strftime('%m',happened_at / 1000,'unixepoch') = 1 AND 0 + strftime('%Y',happened_at / 1000,'unixepoch') = 2009;

相关问题