可以直接比较存储为字符串/文本的日期吗?

时间:2011-03-26 23:42:29

标签: string sqlite datetime comparison

我在SQLite工作,所以我将日期存储为文本。

YYYY-MM-DD hh:mm:ss

据我所知,我应该能够对它们进行排序或比较它们,因为它们不担心日期函数,因为任何递增都是向右开始并向左移动,就像数字一样,并且所有的值都是数字,非数字字符总是标准化,我正在使用24小时。

我一直在网上看到人们提到如何将日期作为文本转换进行任何比较,但我不明白为什么他们不会只是按原样工作,只要他们是最大的 - >最小的订单。显然我不能做数学,但是Select DateTime From Table where DateTime > 2010-04-21 15:34:55应该是完全可靠的,对吗?

我有没有想到的例外情况?

4 个答案:

答案 0 :(得分:5)

这很好用。 SQLite没有像许多其他数据库那样的实际DATE(或DATETIME)数据类型。您可以选择以正确排序的字符串格式(YYYY-MM-DD或YYYY-MM-DD hh:mm:ss)存储日期,或者将日期转换为数字并存储该数据。

如果您使用字符串格式,那么您当然必须包含引号:

SELECT DateTime FROM Table WHERE DateTime > '2010-04-21 15:34:55'

答案 1 :(得分:3)

在数据库中存储日期时,您看到大量转换提及的原因是,大多数数据库引擎都具有日期/时间的“本机”数据类型。 SQLite没有。它建议您将日期存储为字符串或julian日期浮点值。

此外,其他一些数据库有相当模糊的日期到字符串函数(我在看你,SQL Server),很难弄清楚如何获得一个可排序的日期字符串。 SQLite的默认日期格式(YYYY-MM-DD HH:NN:SS)完全可排序且易于阅读。

比较或整理时,您可以处理文本日期 - 只要您使用正确的格式,就像您正在展示一样。

事实上,你甚至可以通过使用SQLite的date and time functions来做数学运算。他们相当不正统,但却非常灵活。

答案 2 :(得分:1)

只要实际值与您期望的值相同,就可以将它们作为文本进行比较。那就是问题所在。

比较日期,因为文字就像用剪刀跑。但SQLite让你一直用剪刀运行。

sqlite> create table test (d1 datetime primary key);
sqlite> insert into test values ('2011-31-31 08:63:00');
sqlite> select * from test;
2011-31-31 08:63:00

当您尝试插入或更新“2011-31-31 08:63:00”等值时,符合SQL标准的dbms将引发“超出范围”错误。但SQLite允许您插入任何内容。您甚至可以将“Catcall”插入日期时间列。 (试试吧。)

如果您使用文本,SQLite会为您提供相同的“使用剪刀运行”行为。

sqlite> create table test (d1 varchar(25) primary key);
sqlite> insert into test values ('2011-31-31 08:63:00');
sqlite> select * from test;
2011-31-31 08:63:00

如果值不符合您的预期,您可能会看到以下类型的行为。

sqlite> create table test (d1 varchar(25), d2 varchar(25));
sqlite> insert into test values ('2011-01-01 08:00:00', '2011-01-01 08:15:00');
sqlite> select d1<d2 from test;
1
sqlite> update test set d2 = '2011+01-01 08:15:00';
sqlite> select d1<d2 from test;
0

答案 3 :(得分:1)

如果您正在进行整理和搜索,那么您应该没问题。人们多年来一直使用这种格式的文件名就是为了这个目的。如果您需要执行涉及计算的事情(例如在特定日期的30天内查找所有记录),它应该只会开始崩溃。