sql语句查询时间范围

我记得有一次我在数据库中查找项目的开始和结束日期。
该项目以表格格式编写,日期字段采用日期时间格式。
我一开始就想过用BETWEEN...AND...,但是当我直接输入日期字符串的时候,我发现系统给我提示格式不正确。
当我检查日期格式时,我输入的结果是“2 02 1 -01 -01 ”,但系统期望的是“2 02 1 01 01 ”。
后来我以正确的格式重新输入了它,并且 BETWEEN...AND... 工作顺利。

等一下,还有一个问题。
在我之前的项目中,日期字段是varchar类型。
由于当时我没有修改该字段的权限,因此我不得不使用 LIKE 和转换函数。
有一次,我记得查看某月的记录,输入的SQL语句是CONVERT(VARCHAR(1 0), date field, 1 08 ) LIKE '2 02 1 01 %'。
结果发现有些日期找不到。
后来我发现由于转换函数中的格式问题,某些日期转换不正确。

我突然想到,如果我能够直接将 varchar 类型字段改回 datetime 类型,那么查询 varchar 类型字段会容易得多。
但它也提醒我在使用数据库时了解数据类型和字段格式是多么重要。

SQL数据库中如何查询包含多个日期值的字段特定日期范围的数据?

直接得出结论,不要担心所有花里胡哨的东西。

方法一:MySQL字符串函数,适用于逗号分隔的日期字段。
平方米 选择epr。
来自 event_plan_record epr 哪里 FIND_IN_SET({startDate}, REPLACE(epr.realStartTime, ' ', '')) > 0 或 FIND_IN_SET({endDate}, REPLACE(epr.realStartTime, ' ', '')) > 0 或存在( 选择1 来自( SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(REPLACE(epr.realStartTime, ' ', ''), ',', n.n), ',', -1 ) AS 日期值 来自 information_schema.columns JOIN (SELECT @rownum:=@rownum+1 AS n FROM (SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 ) 到 JOIN (SELECT @rownum:=0) r) AS n ON LENGTH(REPLACE(epr.realStartTime, ' ', ''))
LENGTH(REPLACE(REPLACE(epr.realStartTime, ' ', ''), ',', '')) >= n.n
1 WHERE n.n <= LENGTH(REPLACE(epr.realStartTime, ' ', ''))
LENGTH(REPLACE(REPLACE(epr.realStartTime, ' ', ''), ',', '')) + 1 ) AS 数据值 WHERE date_value BETWEEN {startDate} 和 {endDate} 之间 ) 按 epr.realStartTime DESC 排序 LIMIT {page}, {count};
评论:这个SQL很难写,性能很差。

方法二:关联表设计,推荐长期方案。
平方米 选择 e。
来自事件 e 订阅 event_dates 和 ON e.event_id = ed.event_id ed.event_date 在 {startDate} 和 {endDate} 之间 GROUP BY e.event_id;
优点:索引优化,快速范围查询。

方法 3 :其他数据库替代方案。
PostgreSQL: 平方米 选择epr。
FROM event_plan_record epr, unnest(string_to_array(REPLACE(epr.realStartTime, ' ', ''), ',')) AS date_value WHERE date_value::date BETWEEN {startDate}::date AND {endDate}::date;
SQL Server (2 01 6 +): 平方米 选择epr。
来自 event_plan_record epr 交叉应用 STRING_SPLIT(REPLACE(epr.realStartTime, ' ', ''), ',') AS date_value WHERE CONVERT(date, date_value.value) BETWEEN {startDate} AND {endDate};
注意:SQL Server 需要版本 2 01 6 +。

总结:短期使用方法一,长期使用方法二。
别他妈含糊了。