2017-05-05 27 views
1

我在BQ中使用标准SQL具有以下语句。我被要求转换为Legacy以与第三方应用程序一起使用..我正在努力使用Date_Diff函数。任何帮助,将不胜感激在大查询中使用日期差异

1 - 选择DATE_ADD(日期([Client_StartDate]),间隔 - DATE_DIFF(DATE([Client_StartDate]),CURRENT_DATE,年)年)作为AnniversaryDate

2 - 选择DATE_DIFF( CURRENT_DATE,DATE([Client_StartDate]),月)为MonthsSinceStart

+0

什么是不支持标准SQL的第三方应用程序?你可以在应用程序的查询顶部使用'#standardSQL'注释吗? –

+0

我不知道,我只是按照我的CTO告诉的那样做。我认为它更多的是应用程序有其他的东西在使用旧版本,所以在这两个版本之间切换不可行 –

+0

没有理由不能同时使用两者,尽管......许多其他BigQuery用户混合使用传统和标准SQL查询,同时向标准SQL迁移。当然,这取决于你/你的首席技术官,但我真的只是建议使用标准的SQL,而不是花时间学习遗留SQL的怪癖。 –

回答

2

传统的SQL:

为纪念今年开始日期:

#legacySQL 
SELECT 
    DATE_ADD(
    Client_StartDate, 
    YEAR(CURRENT_TIMESTAMP()) - YEAR(Client_StartDate), 
    "YEAR") AS AnniversaryDate 
FROM (SELECT TIMESTAMP('2015-02-23') AS Client_StartDate); 

以来的起始日期的月数:

#legacySQL 
SELECT 
    (YEAR(CURRENT_TIMESTAMP()) - YEAR(Client_StartDate)) * 12 + 
    (MONTH(CURRENT_TIMESTAMP()) - MONTH(Client_StartDate)) AS MonthsSinceStart 
FROM (SELECT TIMESTAMP('2015-02-23') AS Client_StartDate); 

标准SQL:

为纪念今年的开始日期(假设为一个时间戳):

#standardSQL 
SELECT 
    DATE(EXTRACT(YEAR FROM CURRENT_DATE()), 
     EXTRACT(MONTH FROM Client_StartDate), 
     EXTRACT(DAY FROM Client_StartDate)) AS AnniversaryDate 
FROM (SELECT TIMESTAMP '2015-02-23' AS Client_StartDate); 

对于自开始日期起的月数(假定为时间戳):

#standardSQL 
SELECT 
    DATE_DIFF(
    CURRENT_DATE(), 
    EXTRACT(DATE FROM Client_StartDate), MONTH) AS MonthsSinceStart 
FROM (SELECT TIMESTAMP '2015-02-23' AS Client_StartDate); 

有关遗留SQL查询的一件事是,它们使用TIMESTAMP而不是DATE类型(DATE对遗留SQL有有限的功能)。 DATE是一个很好的类型,可以在标准SQL中使用,因为它是一个逻辑时间点,而不是物理时间点,并且不受时区限制。你可以在data types reference中阅读更多关于它的信息。

+0

完美,谢谢 –