我想選擇自20th上個月以來的所有行。
我知道我可以使用 選擇一個月前的日期SELECT NOW() - INTERVAL 1 MONTH,但是如何設定該月的特定日期?
今天是March 28th,我想選擇所有比February 20th.
即使我可以直接設定日期,如果查詢的日期31st對于 2 月不起作用,那么它應該選擇該月的最后一天。
注意:20th 只是一個示例,該值是在代碼中的其他位置動態生成的。
一些例子:
Day: 20th each month
Now: March 28th | Query: February 20th
Now: May 28th | Query: April 20th
Day: 31st each month
Now: March 28th | Query: February 28th // we select last day instead of 31st
Now: May 28th | Query: April 30th // we select last day instead of 31st
完整的查詢類似于SELECT * FROM sales WHERE date > SET_DAY(20, NOW() - INTERVAL 1 MONTH).
那么,我可以用什么代替它SET_DAY(這也適用于較短的月份)?
一個非常常見的用例是計費周期,您希望從當前計費周期內選擇所有資料。
uj5u.com熱心網友回復:
好吧,我相信這可以解決問題
select now()
- interval 1 month
- interval(
day(now())
- least(
20,
day(last_day(now() - interval 1 month))
)
) day
uj5u.com熱心網友回復:
假設您在客戶端中有一個引數是目標天數,并且您想在 sql 中驗證它(確保您想出上個月內的一天),而不是在客戶端中,我會這樣做:
least(
date(date_format(current_date - interval 1 month, '%Y-%m-01')) interval ? - 1 day,
date(date_format(current_date, '%Y-%m-01')) - interval 1 day
)
一個注意事項:current_date 將是連接時區中的當前日期,由客戶端控制;如果我知道我想要一天在哪個時區,我更喜歡總是明確的,比如:
date(convert_tz(utc_timestamp(), ' 00:00', 'America/Los_Angeles'))
而不僅僅是 current_date (兩個地方)。
uj5u.com熱心網友回復:
我剛剛意識到我的問題并不包括所有案例。如果最后一個計費日期在本月內,則應計入本月 20 日(不是上一個)。
根據@ysth 的回答,我添加了一個 IF 來選擇本月 20 日(如果我們通過了),否則選擇上個月:
IF(DAY(current_date) >= 20,
date(date_format(current_date, '%Y-%m-01')) interval 20 - 1 day,
least(
date(date_format(current_date - interval 1 month, '%Y-%m-01')) interval 20 - 1 day,
date(date_format(current_date, '%Y-%m-01')) - interval 1 day
)
);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/451446.html
下一篇:在Date.now()中添加3天
