mysql 需要SQL查询-始终获取前一日期的数据,其中日期列被拆分为多个列

pzfprimi  于 2023-01-16  发布在  Mysql
关注(0)|答案(2)|浏览(118)

我想获取日期等于前一天的行,

表模式如下所示,

-- create a table
CREATE TABLE students (
  id INTEGER PRIMARY KEY,
  name TEXT NOT NULL,
  gender TEXT NOT NULL,
  xYear INTEGER,
  xMonth INTEGER,
  xDay INTEGER,  
);

--样表--
| 身份证|姓名|性别|x年|x月|x天|
| - ------|- ------|- ------|- ------|- ------|- ------|
| 1个|瑞安|男|二○二三|1个|十二|
| 第二章|乔安娜|F级|二○二三|1个|十二|
| 三个|罗|男|二○二三|1个|十一|
| 四个|汉|F级|二○二三|1个|十二|
| 五个|塔|男|二○二三|1个|十一|
| 六个|运行|F级|二○二三|1个|十一|
| 七|拉达|男|二○二三|1个|十二|
| 八个|塞纳|F级|二○二三|1个|十二|
----预期结果----考虑到今天是1月13日,所以我需要1月12日的数据----
| 身份证|姓名|性别|x年|x月|x天|
| - ------|- ------|- ------|- ------|- ------|- ------|
| 1个|瑞安|男|二○二三|1个|十二|
| 第二章|乔安娜|F级|二○二三|1个|十二|
| 四个|汉|F级|二○二三|1个|十二|
| 七|拉达|男|二○二三|1个|十二|
| 八个|塞纳|F级|二○二三|1个|十二|
不确定如何实现这一点。

dy2hfwbg

dy2hfwbg1#

很明显,这是一个不好的DB结构,日期应该作为date存储在一个单列中,而不是将来。
创建所需的结果可以通过从这三列中构建一个日期来实现,然后检查该日期是否为昨天。
有很多函数可以完成这项工作,这里使用CASTCONCAT的一种方法:

SELECT 
id, name, gender,  
xYear, xMonth, xDay
FROM students
WHERE 
  CAST(CONCAT(xYear,'-',xMonth,'-',xDay) AS DATE) 
    = CURDATE() - INTERVAL 1 DAY;

您也可以在不使用CAST的情况下尝试上述操作,并检查其执行速度是否更快:

SELECT 
id, name, gender,  
xYear, xMonth, xDay
FROM students
WHERE 
  CONCAT(xYear,'-',xMonth,'-',xDay) = CURDATE() - INTERVAL 1 DAY;

请在此试用:db<>fiddle

ubof19bj

ubof19bj2#

您可以将列连接为字符串,然后将其转换为日期并与“yesterday”进行比较

select  * 
from students 
where STR_TO_DATE(concat(xYear, '-',xMonth, '-',xDay), "%Y-%m-%d")=DATE_SUB(CURDATE(), INTERVAL 1 DAY)

Demo

相关问题