【问题标题】:DateSub function based on other field integer in BigQuery基于 BigQuery 中另一个字段整数的 Date_Sub 函数
【发布时间】:2020-10-15 01:42:05
【问题描述】:

我正在尝试根据年龄和输入我们系统的日期来计算某人的出生年份。如何使用 Date_Sub 函数,将年龄字段用作我的时间间隔?

UPDATE `test.table` 
SET BirthYear = DATE_SUB(DateEntered, INTERVAL Age YEAR) 
WHERE BirthYear IS NULL;

当我尝试这个查询时,我收到以下错误:

Interval value must be coercible to INT64 type at [2:50]

我尝试将 Age 字段转换为 INT64:

No matching signature for function DATE_SUB for argument types: DATETIME, INTERVAL INT64 DATE_TIME_PART. Supported signature: DATE_SUB(DATE, INTERVAL INT64 DATE_TIME_PART) at [2:21]

我的表看起来像这样,其中 BirthYear 和 DateEntered 是 DateTime,Age 字段是一个字符串:

BirthYear   DateEntered          Age
NULL        2016-09-18T04:00:00  10
NULL        2020-09-18T00:00:00  7
NULL        2018-03-08T00:00:00  6.5

【问题讨论】:

    标签: google-bigquery


    【解决方案1】:

    改用 DATETIME_SUB

    DATETIME_SUB(DateEntered, INTERVAL SAFE_CAST(SAFE_CAST(Age AS FLOAT64) AS INT64) YEAR) 
    

    【讨论】:

    • 做到了。谢谢
    • 在验证我的数据后,这个查询似乎没有正确计算半年。例如,如果年龄为 0.5,输入日期为 2019-12-19T02:01:00,则出生年份的结果应为 2019。除了这个查询输出是 2018 年。有什么想法吗?
    • 取决于您需要什么舍入逻辑,您应该在转换为 int 之前调整年龄。例如,您可以使用age + 0.5 或使用相应的功能,如 FLOOR、CEILING 等!
    • 感谢您的提示,我想我不确定将年龄字段舍入的最佳方法,因为如果年龄是例如 6.5 = 6 岁零 6 个月大。我试过DATETIME_SUB(DateEntered, INTERVAL SAFE_CAST(SAFE_CAST(FLOOR(Age)as FLOAT64) as INT64) YEAR),但仍然存在差异。我需要将年龄转换为月份吗?
    • 这不太可能在 cmets 中解决您案例的所有新方面。我建议发布新问题,其中包含您想要遵循的所有新细节、逻辑和规则以及输入数据和预期输出的示例。如果您这样做,我们将能够为您提供进一步的帮助。但是当前的问题已经完全回答了,所以让我们保持原样并进入新帖子:o)
    猜你喜欢
    • 2023-01-19
    • 2013-08-25
    • 2021-07-16
    • 1970-01-01
    • 2017-07-12
    • 1970-01-01
    • 2010-11-13
    • 2021-06-27
    • 1970-01-01
    相关资源
    最近更新 更多