2014-03-01 18 views
3

我真的陷入试图在Objective C.这里的SQLite查询来比较日期是我在做什么:SQLite的存储,检索和比较一个DATETIME场

存放日期:

This document告诉我使用下面指定的日期格式,但它看起来不正确。尽管我尝试使用yyyy-MM-dd hh:mm:ss但没有成功。

NSDate *today = [NSDate date]; 
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; 
[dateFormat setDateFormat:@"YYYY-MM-DD HH:MM:SS"]; 
NSString *dateString=[dateFormat stringFromDate:today]; 

NSString *query = [NSString stringWithFormat: @"INSERT INTO user (edited) VALUES (\"%@\")", dateString]; 

比较日期

我使用时间戳这一点,我转换为datetime字符串

long stamp = [sessie integerForKey:@"stamp"]; 

NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
[formatter setDateFormat:@"YYYY-MM-DD HH:MM:SS"]; 
NSString *dateString = [formatter stringFromDate:[NSDate dateWithTimeIntervalSince1970:stamp]]; 

sqlite3_stmt *result = [db selectQuery:[NSString stringWithFormat:@"SELECT * FROM user WHERE edited > '%@'", dateString]]; 

的时间戳使用[[NSDate date] timeIntervalSince1970]简单地生成。问题是查询不会给出正确的结果,我甚至不知道日期是否正确存储在第一位。任何帮助将不胜感激!

+1

不相关,但我认为你知道你应该警惕使用'stringWithFormat'来构建你的SQL。在这种情况下可以,但是如果使用任何用户输入,你应该在'sqlite3_bind_text'中使用'?'占位符,否则你会暴露出一大堆问题。做'sqlite3_bind_xxx'正常工作可能会很麻烦,但使用[FMDB](https://github.com/ccgus/fmdb)也可以让你的生活更容易与数据库连接(并且它完全解决了与日期相关的问题,太)。 – Rob

+0

谢谢你指出。我一定会检查FMDB。今天我学到了很多东西:) – Tumtum

回答

4

一对夫妇的意见:

  1. 为了您的日期字符串,你肯定不希望使用YYYY-MM-DD HH:MM:SS。这将不会生成有效的日期字符串。使用yyyy-MM-dd hh:mm:ss更接近但不完全正确,因为您将使用12小时hh。改为使用yyyy-MM-dd HH:mm:ss

  2. 但是,这种日期格式并没有捕获时区,所以如果你在你的SQLite数据库中存储日期字符串,你应该使用SQLite Date And Time Functions文档中讨论的UTC(GMT)。

    NSDateFormatter * formatter = [[NSDateFormatter alloc] init]; 
    [formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; 
    formatter.timeZone = [NSTimeZone timeZoneWithName:@"UTC"]; 
    formatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]; 
    NSString *dateString = [formatter stringFromDate:today]; 
    

    如上图所示,你可能也想指定locale,这样的日期格式将不依赖于设备的本地化设置更改。

  3. 请注意,您可能会考虑使用timeIntervalSince1970将日期存储为数据库中的REAL值(而不是TEXT)。这可以更有效一些并自动解决UTC问题。

+1

使用像你这样的时间戳的比较建议像魅力一样工作。感谢使用日期格式的提示,非常有指导意义! – Tumtum