上个月的最后一天 - 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的主要内容,如果未能解决你的问题,请参考以下文章

js如何获取上个月第一天和最后一天

如何用sql获取上个月的第一天和上个月的最后一天

js代码实现,如何获取当前月份的最后一天

oracle sql 最近5个季度的最后一天

Java中获取去年最后一天的日期

sql如何取某年某月的第一天和最后一天