Как получить первый день каждого месяца в mysql?

Я хочу получить первый день каждого соответствующего месяца текущего года. Например, если пользователь выбирает "2010-06-15", запрос требует выполнения от "2010-06-01" вместо "2010-06-15".

Пожалуйста, помогите мне рассчитать первый день с выбранной даты. В настоящее время я пытаюсь получить желаемый, используя следующий запрос выбора mysql:

Select
  DAYOFMONTH(hrm_attendanceregister.Date) >=
  DAYOFMONTH(
    DATE_SUB('2010-07-17', INTERVAL - DAYOFMONTH('2010-07-17') + 1 DAY
  )
FROM
  hrm_attendanceregister;

Спасибо

Ответ 1

Это то, что вы ищете:

select CAST(DATE_FORMAT(NOW() ,'%Y-%m-01') as DATE);

Ответ 2

Вы можете использовать LAST_DAY функцию, предоставленную MySQL, чтобы получить последний день любого месяца, что легко:

SELECT LAST_DAY('2010-06-15');

Вернется:

2010-06-30

К сожалению, MySQL не предоставляет никакой функции FIRST_DAY для получения первого дня месяца (не уверен, почему). Но, учитывая последний день, вы можете добавить день и вычесть месяц, чтобы получить первый день. Таким образом, вы можете определить пользовательскую функцию:

DELIMITER ;;
CREATE FUNCTION FIRST_DAY(day DATE)
RETURNS DATE DETERMINISTIC
BEGIN
  RETURN ADDDATE(LAST_DAY(SUBDATE(day, INTERVAL 1 MONTH)), 1);
END;;
DELIMITER ;

Таким образом:

SELECT FIRST_DAY('2010-06-15');

Вернется:

2010-06-01

Ответ 3

На самом деле существует прямое решение, так как первый день месяца просто today - (day_of_month_in_today - 1):

select now() - interval (day(now())-1) day

Сравните это с другими методами, которые чрезвычайно круговыми и косвенными.


Кроме того, поскольку нас не интересует компонент времени, curdate() является лучшей (и более быстрой) функцией, чем now(), Мы также можем воспользоваться subdate() 2-arity overload, так как это более эффективно, чем при использовании interval. Поэтому лучшим решением является:

select subdate(curdate(), (day(curdate())-1))

Ответ 4

Это старый, но это может быть полезно для новых искателей веб-сайтов XD

В первый день текущего месяца вы можете использовать:

SELECT LAST_DAY(NOW() - INTERVAL 1 MONTH) + INTERVAL 1 DAY;

Ответ 5

Вы можете использовать EXTRACT, чтобы получить нужную дату:

EXTRACT( YEAR_MONTH FROM DATE('2011-09-28') )
-- 201109

Это хорошо работает для группировки.

Ответ 6

Я удивлен, что никто не предложил что-то похожее на это (я не знаю, насколько это возможно):

CONCAT_WS('-', YEAR(CURDATE()), MONTH(CURDATE()), '1')

Для удаления форматирования могут быть выполнены дополнительные операции даты

Ответ 7

Вы можете использовать функцию DATE_FORMAT(), чтобы получить первый день любого поля даты.

SELECT DATE_FORMAT(CURDATE(),'%Y-%m-01') as FIRST_DAY_CURRENT_MONTH 
FROM dual;

Измените Curdate() с любым другим полем даты, например:

SELECT DATE_FORMAT(purchase_date,'%Y-%m-01') AS FIRST_DAY_SALES_MONTH 
FROM Company.Sales;

Затем, используя свой собственный вопрос:

SELECT *
FROM
  hrm_attendanceregister
WHERE
hrm_attendanceregister.Date) >=
 DATE_FORMAT(CURDATE(),'%Y-%m-01')

Вы можете изменить CURDATE() с любой другой заданной датой.

Ответ 8

использовать date_format метод и проверить только месяц и год

select * from table_name where date_format(date_column, "%Y-%m")="2010-06"

Ответ 9

date_add(subdate(curdate(), interval day(?) day), interval 1 day)

изменить? на соответствующую дату

Ответ 10

Это отлично работает для меня.

 date(SUBDATE("Added Time", INTERVAL (day("Added Time") -1) day))

** заменить "Добавлено время" с именем столбца

Случаи использования:

  • Если вы хотите reset все поля даты, кроме Месяц и Год.

  • Если вы хотите сохранить формат столбца как "дата". (не как "текст" или "число" )

Ответ 11

Медленно (17 с):

SELECT BENCHMARK(100000000, current_date - INTERVAL (day(current_date) - 1) DAY); 
SELECT BENCHMARK(100000000, cast(DATE_FORMAT(current_date, '%Y-%m-01') as date));

Если вам не нужен тип даты, это быстрее: быстро (6 с):

SELECT BENCHMARK(100000000, DATE_FORMAT(CURDATE(), '%Y-%m-01'));
SELECT BENCHMARK(100000000, DATE_FORMAT(current_date, '%Y-%m-01'));

Ответ 12

select big.* from
(select @date := '2010-06-15')var
straight_join 
(select * from your_table where date_column >= concat(year(@date),'-',month(@date),'-01'))big;

Это не приведет к полному сканированию таблицы.