【问题标题】:storing date in 'CCYYMMDD' format in Teradata在 Teradata 中以“CCYYMMDD”格式存储日期
【发布时间】:2020-04-19 04:44:12
【问题描述】:

我想在 Teradata 中以 CCYYMMDD 格式存储日期,但我没有这样做。在下面找到我到目前为止尝试过的内容:

查询 1:

SEL CAST(CAST(CURRENT_DATE AS DATE FORMAT 'YYYYMMDD') AS VARCHAR(8))
-- Output: 20191230  ==> this works!

查询 2:

SEL CAST(CAST(CURRENT_DATE AS DATE FORMAT 'CCYYMMDD') AS VARCHAR(8))
-- output: SELECT Failed.  [3530] Invalid FORMAT string 'CCYYMMDD'.

似乎CCYYMMDD 在 Teradata 中不可用。有解决办法吗?

使用的工具:Teradata SQL 助手

【问题讨论】:

  • 看起来 CC 指的是年份的前两位数字(即 2019 年的 20 或 1998 年的 19)。 stackoverflow.com/questions/33420395/…。所以CCYY应该等价于YYYY
  • 感谢@ravioli 的回复。业务要求是存储世纪编号来代替“CC”。例如 2019-12-30 应存储为“21191230”。
  • 好的,我现在明白了。请参阅下面的答案。

标签: sql teradata-sql-assistant


【解决方案1】:

在内部,日期在 Teradata 中存储为整数。所以当你说你想以不同的格式存储它们时,我认为你不能这样做。但您可以选择如何显示/返回值。

我确信有一种更简洁的方法可以获得您想要的格式,但这里有一种方法:

WITH cte (mydate) AS (
  SELECT CAST(CAST(CURRENT_DATE AS DATE FORMAT 'YYYYMMDD') AS CHAR(8)) AS mydate
)
SELECT 
  CAST(
    (CAST(SUBSTRING(mydate FROM 1 FOR 2) AS INTEGER) + 1) -- generate "century" value
    AS CHAR(2) -- cast value as string
  ) || SUBSTRING(mydate FROM 3) AS new_date -- add remaining portion of date string
FROM cte

SQL Fiddle - Postgres

您必须添加一些额外的逻辑来处理 1000 年之前和 9999 年之后的年份。我没有要测试的 TD 系统,但试一试并告诉我。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-15
    • 1970-01-01
    • 2017-05-26
    • 2017-09-28
    • 2018-11-09
    • 1970-01-01
    • 2014-12-01
    相关资源
    最近更新 更多