如何在不使用 CURDATE、MONTH、YEAR 等 DATE 函数的情况下从 RDBMS 获取当前月份记录

Posted

技术标签:

【中文标题】如何在不使用 CURDATE、MONTH、YEAR 等 DATE 函数的情况下从 RDBMS 获取当前月份记录【英文标题】:How to get current month records from RDBMS without using DATE functions like CURDATE,MONTH,YEAR 【发布时间】:2022-01-04 09:21:12 【问题描述】:

我想为 mysql nad sqlite3 编写 sql 兼容性查询。 在mysql中我写了一个查询来获取当前月份的记录

so_date 是日期字段(YYYY-MM-DD)

select so_no,so_date from so_master where MONTH(CURDATE()) = MONTH(so_date) AND YEAR(CURDATE()) = YEAR(so_date);

这在 sqlite3 中不起作用。 在 sqlite 我可以这样写

 select so_no,so_date from so_master where strftime('%Y-%m', so_date) = strftime('%Y-%m', 'now');

但是如果我将 mysql 之类的数据库更改为 sqlite3 或将 sqlite3 更改为 mysql,我的应用程序将无法工作

所以我希望我的查询通过一个查询在两个数据库中工作。

【问题讨论】:

可悲的是,数据库通常有自己特定的日期 API,它们根本不能相互交换。因此,如果您正在执行复杂的日期操作,您基本上会被供应商特定的代码所困扰。 '所以我希望我的查询通过一个查询在两个数据库中工作' - 简短的回答你不能,sql 方言不同,有时很显着。 【参考方案1】:

如果您使用函数SUBSTR()CURRENT_DATE 将日期视为字符串,则可以做到这一点,这在MySql 和SQLite 中都很常见:

SELECT so_no, so_date 
FROM so_master 
WHERE SUBSTR(so_date, 6, 2) = SUBSTR(CURRENT_DATE, 6, 2)
  AND SUBSTR(so_date, 1, 4) = SUBSTR(CURRENT_DATE, 1, 4);

或者,更简单:

SELECT so_no, so_date 
FROM so_master 
WHERE SUBSTR(so_date, 1, 7) = SUBSTR(CURRENT_DATE, 1, 7);

演示for SQLite 和for MySql。

【讨论】:

以上是关于如何在不使用 CURDATE、MONTH、YEAR 等 DATE 函数的情况下从 RDBMS 获取当前月份记录的主要内容,如果未能解决你的问题,请参考以下文章

mysql 命令

add month/year to drop-down list box

mysql 时间日期函数类型和使用

mysql基本操作

如何 用mysql语句获取本季度的第一天 本月

我可以在不存储 group by 和 order by value 的情况下加快此查询吗?