我正在将一些SQL查询转换为针对MariaDB运行,而不是通过SQL Anywhere运行。我需要更新的查询的一部分如下所示:
and datepart(mm,c.dob) = datepart(mm,today()) + 1
查阅了一些MariaDB文档后,我认为第二部分可能需要这样:
MONTH(NOW()) + 1
但是,我不确定如何从原始行重新创建逻辑,因为在MariaDB中未使用datepart
。当我尝试此操作时,查询将运行:
and MONTH(c.dob) = MONTH(NOW()) + 1
这看起来像是正确的替换语法吗?
答案 0 :(得分:0)
在函数调用中隐藏列可防止使用索引。尝试避免这种情况。
进行日期算术时,请使用以下语法:
date_value + INTERVAL 4 DAY
如果使用MONTH(NOW())
,您应该在12月看到什么?
您可以将日期视为2019-09-06
格式的字符串,因此这是获取当前月份开始的一种方法:
mysql> SELECT NOW(), CONCAT(LEFT(CURDATE(), 7), '-01');
+---------------------+-----------------------------------+
| NOW() | CONCAT(LEFT(CURDATE(), 7), '-01') |
+---------------------+-----------------------------------+
| 2019-09-06 11:38:37 | 2019-09-01 |
+---------------------+-----------------------------------+
因此,即使在12月,这也可以给您下个月的开始:
CONCAT(LEFT(CURDATE(), 7), '-01') + INTERVAL 1 MONTH
比较日期通常比分隔日期更可取-我想到的是12月的问题。还有leap日。
WHERE my_date >= CONCAT(LEFT(CURDATE(), 7), '-01') + INTERVAL 1 MONTH
将检查my_date
是下个月(或更晚)。无论my_date
是DATE
,DATETIME
还是TIMESTAMP
,这都行得通。
但是,由于dob
是“出生日期”,因此我所说的大部分内容都是无关紧要的,您确实需要MONTH(dob)