【问题标题】:Vertica: How to create a new column by subtracting two other columns?Vertica:如何通过减去另外两列来创建新列?
【发布时间】:2020-04-21 00:29:20
【问题描述】:

我有一个名为 Start_End 的 Vertica 表,例如:

|   name |    Started |      Ended |
------------------------------------
| Albert | 1970-01-16 | 1970-06-01 |
|  Barry | 1992-05-01 | 1992-07-14 |
|  Carol | 2001-03-16 | 2001-06-03 |

它有大约 100,000 行。

如何使用months_betweenEnded 中减去Started

生成的表格如下所示:

|   name |    Started |      Ended | Month_diff |
-------------------------------------------------
| Albert | 1970-01-16 | 1970-06-01 |           4|
|  Barry | 1992-05-01 | 1992-07-14 |           2|
|  Carol | 2001-03-16 | 2001-06-03 |           2|

下面会添加一个空白列:

ALTER TABLE Start_End
ADD COLUMN Month_diff INTEGER

如何使用months_between

【问题讨论】:

    标签: sql vertica


    【解决方案1】:

    检查这里: https://www.vertica.com/docs/9.3.x/HTML/Content/Authoring/SQLReferenceManual/Functions/Date-Time/MONTHS_BETWEEN.htm?zoom_highlight=MONTHS%20BETWEEN

    找出 MONTHS_BETWEEN() 的行为(何时返回 INTEGER、何时返回 FLOAT、每月最后一天的行为等)是否是您需要的行为。 否则,您可能希望首先 DATE_TRUNC() 两个操作数,例如,正如@Gordon Linoff 所建议的那样。或者使用 TIMESTAMPDIFF(month, ...) 代替: https://www.vertica.com/docs/9.3.x/HTML/Content/Authoring/SQLReferenceManual/Functions/Date-Time/TIMESTAMPDIFF.htm?zoom_highlight=timestampdiff

    也就是说,试试这个尺寸:

    ALTER TABLE start_end
    ADD month_diff INTEGER DEFAULT MONTHS_BETWEEN(ended,started)
    

    祝你好运……

    【讨论】:

    • 我收到错误:[Vertica][VJDBC](3457) ROLLBACK: Function MONTHS_BETWEEN(varchar, varchar) does not exist, or permission is denied for MONTHS_BETWEEN(varchar, varchar)
    • 我通过将列包装在 CAST(col AS DATE) 中解决了这个问题:ALTER TABLE start_end ADD month_diff INTEGER DEFAULT MONTHS_BETWEEN(CAST(ended AS DATE), CAST(started AS DATE))
    • 在 Vertica 中,您可以直接使用,例如 '2020-04-21'::DATE。双冒号是强制转换运算符。如果您的输入列是 varchars,但始终包含格式为 'yyyy-mm-dd' 或 'mm/dd/yyyy' 或 'dd.mm.yyyy' 的日期,那么您应该将这些列维护为 DATEs ,而不是 VARCHARs。然后,您不必对 MONTHS_BETWEEN() 的操作数进行类型转换 ...
    【解决方案2】:

    您似乎希望两个日期之间有完整的月份。它认为这是:

    select months_between(date_trunc('month', ended), date_trunc('month', started)) - 1 as month_diff
    

    【讨论】:

      猜你喜欢
      • 2021-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-04
      相关资源
      最近更新 更多