Ответ 1
Это то, что вы ищете:
select CAST(DATE_FORMAT(NOW() ,'%Y-%m-01') as DATE);
Я хочу получить первый день каждого соответствующего месяца текущего года. Например, если пользователь выбирает "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;
Спасибо
Это то, что вы ищете:
select CAST(DATE_FORMAT(NOW() ,'%Y-%m-01') as DATE);
Вы можете использовать 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
На самом деле существует прямое решение, так как первый день месяца просто 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))
Это старый, но это может быть полезно для новых искателей веб-сайтов XD
В первый день текущего месяца вы можете использовать:
SELECT LAST_DAY(NOW() - INTERVAL 1 MONTH) + INTERVAL 1 DAY;
Вы можете использовать EXTRACT
, чтобы получить нужную дату:
EXTRACT( YEAR_MONTH FROM DATE('2011-09-28') )
-- 201109
Это хорошо работает для группировки.
Я удивлен, что никто не предложил что-то похожее на это (я не знаю, насколько это возможно):
CONCAT_WS('-', YEAR(CURDATE()), MONTH(CURDATE()), '1')
Для удаления форматирования могут быть выполнены дополнительные операции даты
Вы можете использовать функцию 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() с любой другой заданной датой.
использовать date_format метод и проверить только месяц и год
select * from table_name where date_format(date_column, "%Y-%m")="2010-06"
date_add(subdate(curdate(), interval day(?) day), interval 1 day)
изменить? на соответствующую дату
Это отлично работает для меня.
date(SUBDATE("Added Time", INTERVAL (day("Added Time") -1) day))
** заменить "Добавлено время" с именем столбца
Случаи использования:
Если вы хотите reset все поля даты, кроме Месяц и Год.
Если вы хотите сохранить формат столбца как "дата". (не как "текст" или "число" )
Медленно (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'));
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;
Это не приведет к полному сканированию таблицы.