【问题标题】:Retrieve month part from date saved in sqlite database table for displaying month wise data从保存在 sqlite 数据库表中的日期中检索月份部分以显示月份数据
【发布时间】:2012-02-02 06:50:01
【问题描述】:

希望每个人都做得很好:)

我已经从保存在 sqlite 数据库中的日期开始检索月份。首先,我要感谢一些指导我将日期正确插入到 sqlite 数据库表中的专家,即以下格式:

[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];

我已经在控制器页面中显示了所有数据,包括日期,比如“查看提醒”页面。

现在我有一个视图控制器供用户查看月份,例如,如果用户从选择器视图中选择月份“一月”,它将导航到视图控制器,在其中显示与所选月份相对应的提醒。

我之前对如何访问从选择器视图中选择的字符串值感到震惊,以便我们可以使用查询:

"SELECT * FROM reminders WHERE Grp = '%@'",appDelegate.groupString

在应用程序委托文件中声明 groupString 的位置,在存在选择器视图的视图控制器中分配一个值,并在显示视图中使用上述查询访问该字符串

这是我发现here 的解决方案。现在我正在尝试做同样的事情来检索日期,即只需将查询写为:

"SELECT * FROM reminders WHERE Date = '%@'",appDelegate.monthString

它不起作用,因为日期保存在@“yyyy-MM-dd HH:mm:ss”中。所以我通过各种链接对此进行了研究,我尝试了以下方法:

"SELECT * FROM reminders WHERE MONTH like 'January %'" 等等。

但正如我所提到的,选择的字符串必须引用该值,因此使用:

MONTH like '%@',appDelegate.monthString

"SELECT * FROM reminders WHERE strftime('%m', Date) = '%@'",appDelegate.monthString

了解 sqlite 日期 数据类型和This Link

他们都没有工作

众所周知,我们有一个直接查询来检索特定月份的所有提醒:

"SELECT * FROM reminders WHERE Date BETWEEN '2012-01-01' AND '2012-01-31'"

效果很好,但我需要引用 January, February,March (从选择器视图中选择)等。作为迄今为止的参考字符串,我不知道如何获取月份部分从日期开始。是否有任何查询可以从日期中检索月份部分,例如 2012-01-01 作为一月或在该特定上下文中的其他日期....

请帮助我,在此先谢谢大家:)

编辑:

我已将显示格式更改为仅月份后跟日期,即:

ReminderClass *remin = [[ReminderClass alloc]init];
remin.Date = [[[NSString alloc]initWithUTF8String:(const char *)sqlite3_column_text(statament, 3)]autorelease];

                NSDateFormatter *dateFormat = [[[NSDateFormatter alloc]init]autorelease];
                [dateFormat setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
                NSDate *date = [dateFormat dateFromString:remin.Date];
                [dateFormat setDateFormat:@"MMMM dd"];
                NSString *dateVal = [dateFormat stringFromDate:date];
                remin.Date = dateVal;

但在我们这样做之前,我们需要编写用于检索数据的 sql 查询,即:

sqlQuery = [NSString stringWithFormat:@"select * from reminders WHERE ????",appDelegate.monthString];

问号是我需要的,再次感谢:)

【问题讨论】:

  • 请给出appDelegate.monthString的示例值。
  • @ikegami Month 字符串不过是在应用程序委托中声明的字符串,我们将选择器视图值分配给该字符串(例如一月、二月、三月、四月等...)。因此基于在选择器视图中选择的值,我们必须显示与所选月份相对应的提醒(比如一月,三月)或者它是什么月份...谢谢您的关注:)
  • @ikegami 我已经找到了解决方案的答案,请在下面查看我的解决方案,无论如何再次感谢您的关注:)

标签: iphone date sqlite


【解决方案1】:

您可以使用 dateFormat 从日期中检索月份:

NSDate *today = [NSDate 日期];

NSDateFormatter *monthFormat = [[NSDateFormatter alloc] init];
[monthFormat setDateFormat:@"MM"];

【讨论】:

  • 感谢您的回答,我的要求不同...请查看标题为EDIT的已编辑帖子
  • 嗨,等待您的回复:)
【解决方案2】:

首先,我们需要手动形成一个日期。为此,我们需要按以下方式创建由所需组件组成的 NSDateComponents:

NSDateComponents *components = [[NSCalendar currentCalendar] components:NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit fromDate:[NSDate date]];

-> 使用组件获取当前年份或当前年份,即:

NSInteger year = [components year];

-> 手动形成 3 个字符串年、月、日以获取起始日期:

NSString *fromString = [NSString stringWithFormat:@"%d",year];
NSString *string2 = [NSString stringWithFormat:@"-%@",appDelegate.monthValue];
NSString *string3 = @"-01";

appDelegate.monthValue 只不过是在 appDelegate 中分配的字符串,并分配有在包含 01,02,03.....12 个月值的 pickerView 中选择的值

我们知道 01 只是任何月份的日期(最小范围),我们可以简单地对其进行硬编码:)

现在我们准备形成 From Date,开始吧:

string2 = [string2 stringByAppendingString:string3];
fromString = [fromString stringByAppendingString:string2];
NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init]autorelease];
[dateFormatter setDateFormat:@"yyyy-MM-dd"];

NSString *dateString=[NSString stringWithString:fromString];

NSDate *fromDate = [dateFormatter dateFromString:dateString];

NSString* finalFromDateString = [dateFormatter stringFromDate:fromDate];

请注意我为形成日期所做的额外更改,使用了 2 个字符串,因为在将字符串分配给 NSDate 时我们会遇到问题(不正确的日期检索,即比实际日期少一天)。更多详情请关注link。现在我们完成了起始日期。

-> 使用月份作为参考获取日期

要获得一个月的日期或最大范围,我们需要使用 NSRange 方法来计算该特定年份中一个月的范围或一个月的天数,这里是:

NSString *toString = [NSString stringWithFormat:@"%d",year];

NSString *monthValue = [NSString stringWithFormat:@"-%@",appDelegate.monthValue];

NSRange monthRange = [gregorian rangeOfUnit:NSDayCalendarUnit inUnit:NSMonthCalendarUnit forDate:fromDate];

NSString *rangeString = [NSString stringWithFormat:@"-%d",monthRange.length];

monthValue = [monthValue stringByAppendingString:rangeString];

toString = [toString stringByAppendingString:monthValue];

NSDate *toDate = [dateFormatter dateFromString:toString];

NSString *finalToDateString = [dateFormatter stringFromDate:toDate];

我们完成了 From date 和 To date 现在使用以下语句形成查询:

NSString *sqlQuery = [NSString stringWithFormat:@"select * from reminders WHERE Date BETWEEN '%@' AND '%@'",finalFromDateString,finalToDateString];

就是这样,现在我们必须能够检索与特定月份或在选择器视图中选择的月份对应的所有数据

谢谢大家,祝大家玩的愉快:)

【讨论】:

    猜你喜欢
    • 2021-04-04
    • 2021-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-16
    • 1970-01-01
    相关资源
    最近更新 更多