传统的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中阅读更多关于它的信息。
什么是不支持标准SQL的第三方应用程序?你可以在应用程序的查询顶部使用'#standardSQL'注释吗? –
我不知道,我只是按照我的CTO告诉的那样做。我认为它更多的是应用程序有其他的东西在使用旧版本,所以在这两个版本之间切换不可行 –
没有理由不能同时使用两者,尽管......许多其他BigQuery用户混合使用传统和标准SQL查询,同时向标准SQL迁移。当然,这取决于你/你的首席技术官,但我真的只是建议使用标准的SQL,而不是花时间学习遗留SQL的怪癖。 –