57

我需要在当月的第一天和当天从 MySQL 数据库中选择数据。

select*from table_name 
where date between "1st day of current month" and "current day"

有人可以提供此查询的工作示例吗?

4

17 回答 17

156
select * from table_name 
where (date between  DATE_ADD(LAST_DAY(DATE_SUB(CURDATE(), interval 30 day), interval 1 day) AND CURDATE() )

或更好 :

select * from table_name 
where (date between  DATE_FORMAT(NOW() ,'%Y-%m-01') AND NOW() )
于 2012-08-04T11:24:55.123 回答
30

我正在寻找一个类似的查询,我需要在查询中使用一个月的第一天。该last_day功能对我不起作用,但DAYOFMONTH派上用场。

因此,如果有人正在寻找相同的问题,以下代码将返回当月第一天的日期。

SELECT DATE_SUB(CURRENT_DATE, INTERVAL DAYOFMONTH(CURRENT_DATE)-1 DAY);

将日期列与该月的第一天进行比较:

select * from table_name where date between 
DATE_SUB(CURRENT_DATE, INTERVAL DAYOFMONTH(CURRENT_DATE)-1 DAY) and CURRENT_DATE
于 2014-04-24T06:41:14.407 回答
5
select * from table_name 
where `date` between curdate() - dayofmonth(curdate()) + 1
                 and curdate()

SQLFiddle 示例

于 2012-08-04T11:26:53.363 回答
3

我使用了以下查询。过去它对我很有用。

select date(now()) - interval day(now()) day + interval 1 day
于 2017-01-07T00:13:47.287 回答
2

尝试这个 :

SET @StartDate = DATE_SUB(DATE(NOW()),INTERVAL (DAY(NOW())-1) DAY);
SET @EndDate = ADDDATE(CURDATE(),1);
select * from table where (date >= @StartDate and date < @EndDate);
于 2016-12-07T10:17:09.957 回答
1

mysql当前月份和当前年份的完整解决方案,它也可以正确使用索引:)

-- Current month
SELECT id, timestampfield 
  FROM table1
 WHERE timestampfield >= DATE_SUB(CURRENT_DATE, INTERVAL DAYOFMONTH(CURRENT_DATE)-1 DAY)
   AND timestampfield <=  LAST_DAY(CURRENT_DATE);

-- Current year
SELECT id, timestampfield 
  FROM table1
 WHERE timestampfield >= DATE_SUB(CURRENT_DATE, INTERVAL DAYOFYEAR(CURRENT_DATE)-1 DAY)
   AND timestampfield <=  LAST_DAY(CURRENT_DATE);
于 2014-10-24T13:17:06.927 回答
1
select * from table
where date between 
(date_add (CURRENT_DATE, INTERVAL(1 - DAYOFMonth(CURRENT_DATE)) day)) and current_date;
于 2013-11-11T03:02:20.357 回答
1

在需要对我在电子商务商店中运行的一些商业智能查询进行相同的查询后,我发现自己在这里。我想添加我的解决方案,因为它可能对其他人有帮助。

set @firstOfLastLastMonth = DATE_SUB(LAST_DAY(DATE_ADD(NOW(), INTERVAL -2 MONTH)),INTERVAL DAY(LAST_DAY(DATE_ADD(NOW(), INTERVAL -2 MONTH)))-1 DAY);
set @lastOfLastLastMonth = LAST_DAY(DATE_ADD(NOW(), INTERVAL -2 MONTH));
set @firstOfLastMonth = DATE_SUB(LAST_DAY(DATE_ADD(NOW(), INTERVAL -1 MONTH)),INTERVAL DAY(LAST_DAY(DATE_ADD(NOW(), INTERVAL -1 MONTH)))-1 DAY);
set @lastOfLastMonth = LAST_DAY(DATE_ADD(NOW(), INTERVAL -1 MONTH));
set @firstOfMonth = DATE_ADD(@lastOfLastMonth, INTERVAL 1 DAY);
set @today = CURRENT_DATE;

今天是 2019-10-08 所以输出看起来像

@firstOfLastLastMonth = '2019-08-01'
@lastOfLastLastMonth = '2019-08-31'
@firstOfLastMonth = '2019-09-01'
@lastOfLastMonth = '2019-09-30'
@firstOfMonth = '2019-10-01'
@today = '2019-10-08'
于 2019-10-08T18:52:53.040 回答
1
select * from <table>
where <dateValue> between last_day(curdate() - interval 1 month + interval 1 day)
                  and curdate();
于 2017-09-24T04:31:01.637 回答
0

这里的所有反应都太复杂了。您知道当前月份的第一天是当前日期,但日期为 01。您可以通过输入 NOW() 方法来使用 YEAR() 和 MONTH() 来构建月份日期。这是解决方案:

select * from table_name 
where date between CONCAT_WS('-', YEAR( NOW() ), MONTH( NOW() ), '01') and DATE( NOW() )

CONCAT_WS() 用分隔符连接一系列字符串(在本例中为破折号)。因此,如果今天是 2020 年 8 月 28 日,YEAR(NOW()) = '2020' 和 MONTH(NOW()) = '08',那么您只需要在末尾附加 '01'。

瞧!

于 2020-08-28T17:01:55.097 回答
0

我用过这个

select DATE_ADD(DATE_SUB(LAST_DAY(now()), INTERVAL  1 MONTH),INTERVAL  1 day) first_day
      ,LAST_DAY(now()) last_day, date(now()) today_day
于 2018-08-07T05:01:45.620 回答
0

一种不太正统的方法可能是

SELECT * FROM table_name 
WHERE LEFT(table_name.date, 7) = LEFT(CURDATE(), 7)
  AND table_name.date <= CURDATE();

因为日期介于月初和现在之间,就相当于本月和现在之前的日期。不过,我确实觉得这比其他一些方法在眼睛上更容易一些。

于 2016-10-05T14:39:52.370 回答
0
SELECT date_sub(current_date(),interval dayofmonth(current_date())-1 day) as first_day_of_month;
于 2017-03-15T14:10:40.600 回答
0

我有一些类似的要求 -find first day of the month但基于year end month用户在他们的个人资料页面中选择的。

问题陈述 - 找出txns用户在他/她的财政年度所做的所有事情。Financial year使用year end月份值确定,其中month可以是任何有效月份 - 1 for Jan, 2 for Feb, , 3 for Mar....12 for Dec

对一些客户来说,有的人financial year endMarch,有的人在观察它December

Scenarios - (Today is `08 Aug, 2018`)
   1. If `financial year` ends on `July` then query should return `01 Aug 2018`.
   2. If `financial year` ends on `December` then query should return `01 January 2018`.
   3. If `financial year` ends on `March` then query should return `01 April 2018`.
   4. If `financial year` ends on `September` then query should return `01 October 2017`.

最后,下面是查询。-

select @date := (case when ? >= month(now()) 
then date_format((subdate(subdate(now(), interval (12 - ? + month(now()) - 1) month), interval day(now()) - 2 day)) ,'%Y-%m-01')
else date_format((subdate(now(), interval month(now()) - ? - 1 month)), '%Y-%m-01') end)

其中?year end月份(值从 1 到 12)。

于 2018-08-10T09:53:56.707 回答
0

Get first date and last date from month and year.

select LAST_DAY(CONCAT(year,'.',month,'.','01')) as registerDate  from user;
   select date_add(date_add(LAST_DAY(end_date),interval 1 DAY),interval -1 MONTH) AS closingDate from user;
于 2021-04-09T06:31:48.813 回答
0

这里的关键是获取该月的第一天。为此,有几种选择。在性能方面,我们的测试表明它们之间没有显着差异 -我们写了一篇关于该主题的完整博客文章。我们的研究结果表明,真正重要的是您是否需要将结果设为 VARCHAR、DATETIME 或 DATE。

获取当月第一天的实际问题的最快解决方案返回 VARCHAR:

SELECT CONCAT(LEFT(CURRENT_DATE, 7), '-01') AS first_day_of_month;

第二快的解决方案给出了 DATETIME 结果——它的运行速度比前一个慢大约 3 倍:

SELECT TIMESTAMP(CONCAT(LEFT(CURRENT_DATE, 7), '-01')) AS first_day_of_month;

最慢的解决方案返回 DATE 对象。不相信我?运行此 SQL Fiddle 并亲自查看

在您的情况下,由于您需要将该值与表中的其他 DATE 值进行比较,因此使用哪种方法并不重要,因为即使您的公式不返回 DATE 对象,MySQL 也会隐式进行转换。

所以说真的,随你挑选。哪个最适合您?我会选择第一个,因为它是最短的并且可以说是最简单的:

SELECT * FROM table_name 
WHERE date BETWEEN CONCAT(LEFT(CURRENT_DATE, 7), '-01') AND CURDATE;

SELECT * FROM table_name 
WHERE date BETWEEN DATE(CONCAT(LEFT(CURRENT_DATE, 7), '-01')) AND CURDATE;

SELECT * FROM table_name 
WHERE date BETWEEN (LAST_DAY(CURRENT_DATE) + INTERVAL 1 DAY - INTERVAL 1 MONTH) AND CURDATE;

SELECT * FROM table_name 
WHERE date BETWEEN (DATE(CURRENT_DATE) - INTERVAL (DAYOFMONTH(CURRENT_DATE) - 1) DAY) AND CURDATE;

SELECT * FROM table_name 
WHERE date BETWEEN (DATE(CURRENT_DATE) - INTERVAL (DAYOFMONTH(CURRENT_DATE)) DAY + INTERVAL 1 DAY) AND CURDATE;

SELECT * FROM table_name 
WHERE date BETWEEN DATE_FORMAT(CURRENT_DATE,'%Y-%m-01') AND CURDATE;
于 2019-11-16T16:09:37.580 回答
-1
SET @date:='2012-07-11';
SELECT date_add(date_add(LAST_DAY(@date),interval 1 DAY), 
       interval -1 MONTH) AS first_day
于 2016-07-23T02:18:00.643 回答