2017-04-03 114 views
0

我需要在where子句中使用9月1日,并且不希望对年份进行硬编码。什么是返回9/1 /年以在两者之间使用的最佳方式?mysql每年的同一天

where p.post_date between '2016-09-01' and DATE_ADD(CURDATE(),INTERVAL 1 DAY) 

寻找“2016-09-01”的替代品,以便它在明年和未来再次发挥作用。此外,需要为同年的十月,十月和十月工作。

+1

你能告诉我们'语句之间'吗?向我们展示数据库模式,样本数据和预期输出。 \t请阅读[**如何提问**](http://stackoverflow.com/help/how-to-ask) \t \t这里是一个伟大的地方[** START **] (http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/)来了解如何提高您的问题质量并获得更好的答案。 –

+0

其中p.post_date位于'2016-09-01'和DATE_ADD(CURDATE(),INTERVAL 1天)之间 正在寻找“2016-09-01”的替代品,以便明年和未来再次运行。 – SJ14420

回答

0

基本上,你想上年当你当你转动日后在本年度的转折日期和当前一个之前。

我建议告诉MySQL你正在使用什么日期格式,这样做,你可以使用STR_TO_DATE函数。

CASE 
    WHEN MONTH(CURDATE()) < 9 THEN STR_TO_DATE(CONCAT(YEAR(CURDATE())-1, '-09-01'), '%Y-%m-%d') 
    ELSE STR_TO_DATE(CONCAT(YEAR(CURDATE()), '-09-01', '%Y-%m-%d')) 
END 

你可以把它放在函数/例程中,并在需要的地方使用它。

+0

就是这样!谢谢。最终溶液:CASE 其中p.post_date之间 WHEN MONTH(CURDATE())<9 THEN STR_TO_DATE(CONCAT(YEAR(CURDATE()) - 1, ' - 09', ' - 01'),“%Y- %0%(%d%) ELSE STR_TO_DATE(CONCAT(YEAR(CURDATE()),' - 09',' - 01'),'%Y-%m-%d')END 和DATE_ADD(CURDATE() ,INTERVAL 1天) – SJ14420

2

您可以使用month()day()

select t.* 
from t 
where month(datecol) = 9 and day(datecol) = 1; 
+0

如何在中间语句中使用它? 其中p.post_date介于'2016-09-01'和DATE_ADD(CURDATE(),INTERVAL 1天) – SJ14420

+0

在列上使用任何类型的函数都会阻止MySQL使用索引。不是一个好主意。 – Pred

+0

@Pred。 。 。我没有看到如何在没有'datecol'函数的情况下回答这个问题。我没有看到你的答案与实际问题有关,但是OP的确如此,而这一点更重要。 –

1

我想你想获得本年度的year/09/01

SELECT * 
FROM YourTable 
WHERE datecol = CONCAT (YEAR(CURDATE()) , '/09/01') 
+0

几乎...有时它会是年减1。 像现在一样,报告期为2016年9月1日至今天。报告期将于明年9月1日重新开始。 – SJ14420