【问题标题】:The last day of the previous month - BigQuery上个月的最后一天 - 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 工作,想知道是否有人对此有想法?

祝你好运

戴夫

【问题讨论】:

    标签: sql tsql google-bigquery


    【解决方案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。
            猜你喜欢
            • 2021-12-24
            • 2021-08-20
            • 2017-01-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-04-03
            相关资源
            最近更新 更多