SQLite日期条件下的选择查询

66

我有一个包含出生日期的sqlite表格。我想执行一条查询来选择那些年龄大于30岁的记录。 我尝试了以下方法,但没有成功:

select * from mytable where dob > '1/Jan/1980'
select * from mytable where dob > '1980-01-01'
5个回答

101

可以使用类似以下的东西:

select dateofbirth from customer Where DateofBirth  BETWEEN date('1004-01-01') AND date('1980-12-31');  
select dateofbirth from customer where date(dateofbirth)>date('1980-12-01');
select * from customer where date(dateofbirth) < date('now','-30 years');

如果您使用的是Sqlite V3.7.12或更高版本

不要使用date(dateofbirth),只需使用dateofbirth。因此,您的查询将如下所示:

select * from customer where dateofbirth < date('now','-30 years');

26
从谷歌搜索而来的所有人请注意:使用sqlite v3.7.12时,现在它已经无法工作了;不要使用 date(dateofbirth),只需要使用 dateofbirth 就可以了。 - wecing
2
只需要注意一件事:date(field) > date('2018-05-20')field > '2018-05-20'对我来说返回的结果不同,因此如果字段不是日期而是日期时间,则使用函数date()是正确工作的唯一方式。 - mojmir.novak

26

使用SQLite网站上的神奇文档:链接

select * from mytable where dob < date('now','-30 years');

5

尝试使用日期格式“YYYY-MM-DD”进行编写

select * from mytable where dob > '1980-01-01'

一种更加编程化的方法可能是这样的:
select * from mytable where datediff(dob, now()) > 30

您需要查找SQLite的特定语法。


4
回到2010年,select * from mytable where dob > '1980-01-01'可能无法工作,但在目前的sqlite3中,这个命令可以完美执行。 - Shane
Sqlite报错:*错误(1):没有这个函数:now错误(1):没有这个函数:datediff*。 - jww

0

QLite3有一些很酷的新日期函数。根据文档网站,您可以使用date()time()datetime()julianday()unixepoch()strftime(),具体取决于您的列数据格式。

如果您使用strftime(),就像我下面的建议一样,那么您必须确保您的列数据与您的strftime字符串格式相同。

您可能想要这样做:

SELECT * FROM mytable WHERE dob < strftime("%m/%d/%Y", 'now', '-30 year');

请注意,您可能需要更改此处的格式字符串以匹配您自己的格式。


以下是我个人使用的一些代码,让您更好地了解它的强大功能。它让我可以获取前三个月的所有订单,不包括本月。

SELECT * FROM orders WHERE SHIPPEDDATE > strftime('%m/%d/%Y', 'now', 'start of month', '-3 month');

在sqlite中,修饰符非常强大。 strftime() 内的第一个字符串是格式,第二个字符串是您想要日期开始的时间。'Start of month' 将日期设置为1号,'-3 month' 回溯3个月。因此,如果我今天运行它(08/03/2022),它使用的日期将是05/01/2022。


0

从mytable中选择*,其中dob的日期>date('1980-01-10')


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接