上个月的最后一天 - BigQuery
Posted
技术标签:
【中文标题】上个月的最后一天 - BigQuery【英文标题】:The last day of the previous month - BigQuery 【发布时间】:2016-07-05 15:50:09 【问题描述】:我正在尝试选择时间戳字段 recdate 的日期值不超过该月最后一天的日期值的行。例如,由于这是 2016 年 7 月,我想要日期值不超过 31-06-2016 的所有行。这曾经在 T-SQL 中正常工作,我将使用以下内容并将其分配给 @today 并将其放在我的 WHERE 中:
DECLARE @today DATETIME SELECT @today = CONVERT(VARCHAR(25),DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE())-0,0)));
我在 BigQuery 中苦苦挣扎,我无法让 DATEDIFF 或 GETDATE 工作,想知道是否有人对此有想法?
祝你好运
戴夫
【问题讨论】:
【参考方案1】:标准 SQL 的另一种方式。
当月第一天:
SELECT DATE_TRUNC(CURRENT_DATE(), MONTH)
上个月的最后一天(当前第一天减去 1):
SELECT DATE_SUB(DATE_TRUNC(CURRENT_DATE(), MONTH), INTERVAL 1 DAY)
下个月的第一天:
SELECT DATE_TRUNC(DATE_ADD(CURRENT_DATE(), INTERVAL 1 MONTH), MONTH)
当月最后一天(下个月第一天减1):
SELECT DATE_SUB(DATE_TRUNC(DATE_ADD(CURRENT_DATE(), INTERVAL 1 MONTH), MONTH), INTERVAL 1 DAY)
【讨论】:
【参考方案2】:2020 年 10 月更新(BigQuery 标准 SQL)
BigQuery 现在支持 LAST_DAY
函数以及算术运算 +
和日期的“-”
所以,现在您可以使用以下选项来获取上个月的最后一天
#standardSQL
select
date_trunc(current_date(), month) - 1,
last_day(date_sub(current_date(), interval 1 month)),
date_sub(last_day(current_date()), interval 1 month)
输出(记住今天是 10 月 14 日)
我个人 - 我喜欢第一个选项,因为它最简洁明了!
--~~~~~~~~~~~~~~~~~~~~~~
使用以下示例(BigQuery Legacy SQL)
SELECT DATE(DATE_ADD(CURRENT_DATE() , -DAY(CURRENT_DATE()), "DAY"))
顺便说一句,六月有 30 天 :o) - Priestley's "The Thirty-First of June" 除外
【讨论】:
好东西米哈伊尔,你又救了我的培根!谢谢!还要注意的是,我将时间戳字段 ResearchActivityDate 用于 WHERE 评估:'WHERE FORMAT_UTC_USEC(bq.ResearchActivityDate) 嗨,Mikhail,当我使用您提供的代码时,我收到了 Expected INTERVAL 表达式的错误,知道为什么会这样吗? @rachel - 适用于 BigQuery Legacy SQL。您很可能使用标准 SQL 进行了尝试。你有吗?【参考方案3】:在标准 SQL 中工作
SELECT DATE_ADD(CURRENT_DATE(), INTERVAL -EXTRACT(DAY FROM CURRENT_DATE()) DAY)
【讨论】:
【参考方案4】:DATE_ADD( CURRENT_DATE(), INTERVAL -EXTRACT( DAY FROM CURRENT_DATE()) DAY)
这是 Google BigQuery 的正确语法。
【讨论】:
【参考方案5】:
从 SQL 2012 开始有一个 EOMONTH 函数:
https://msdn.microsoft.com/en-us/library/hh213020.aspx
用法:
DECLARE @date VARCHAR(255) = '07/01/2016';
SELECT EOMONTH ( @date ) AS Result;
GO
将于 2016 年 7 月 31 日返回
DECLARE @date VARCHAR(255) = GetDate() ; -- To Get End of month for Current Month
SELECT EOMONTH ( @date ) AS Result;
GO
将于 2016 年 7 月 31 日返回
我的坏..我没有意识到 OP 正在寻找上个月的最后一天
但这应该可行:
DECLARE @date Datetime = '12/31/2017' -- Input Date. Has to be Datetime NOT varchar. If incomming date is a varchar it needs to be converted to Datetime.
Select DAY( @date ) -- Returns 31
SELECT @date - DAY( @date ) as LastDayOfPrevMonth
输出:
LastDayOfPrevMonth
2017-11-30 00:00:00.000
我已经尝试过大多数边缘情况,例如闰日、任何一个月的第一天/最后一天等。
【讨论】:
【参考方案6】:适用于任何版本的 SQL Server
SELECT convert(varchar(10),
DATEADD(mm, -1,
DATEADD(s,-1,
DATEADD(mm,
DATEDIFF(m,0,getdate())+1
,0)
)
), 103) AS [LastMonthEnd]
【讨论】:
这个问题是关于 Google Big Query,而不是 SQL Server。以上是关于上个月的最后一天 - BigQuery的主要内容,如果未能解决你的问题,请参考以下文章