【问题标题】:Teradata Current year and year-1Teradata 当年和第 1 年
【发布时间】:2019-03-18 19:16:15
【问题描述】:

如何在查询条件中获取动态年份,我需要获取 2017、2018、2019 年的数据,目前我正在对它们进行硬编码(其中 FSC_YR 在(2017、2018、2019)而不是我需要在动态方式。如何在 teradata 中做到这一点。 我尝试了提取(当前日期的年份)-2,提取(当前日期的年份)-1,提取(当前日期的年份)-3)。我得到的错误太多表达。

【问题讨论】:

  • 到目前为止你尝试了什么??给我们看看!!
  • select * from data where fsc_yr in (extract(year from current_date),extract(year from current_date)-1,extract(year from current_date)-2)) 表达式太多错误

标签: sql teradata


【解决方案1】:

既然您要查找一系列年份数字,为什么不直接使用 BETWEEN?

SELECT * 
FROM data
WHERE fsc_yr BETWEEN EXTRACT(year FROM current_date - interval '2' year) AND EXTRACT(year FROM current_date)

但正如@dnoeth 在 cmets 中指出的那样。
为避免在 2 月 29 日运行时出错,使用 INTERVAL 可能不是最安全的方法。

但是仅仅从年份数字中减去真的还不错。

SELECT * 
FROM data
WHERE fsc_yr BETWEEN EXTRACT(year FROM current_date)-2 AND EXTRACT(year FROM current_date)

另请注意,此类错误可能来自于在查询中为 IN 选择多于 1 列

例如这会失败:

SELECT * FROM Table1 
WHERE Col1 IN (SELECT Col1, Col2 FROM Tabel2)

因此,如果您使用 * 查询数据,那么它仍然会导致该错误。

【讨论】:

  • 你最好切换到ADD_MONTHS(current_date, -2*12)而不是间隔计算(将在闰日失败,'2020-02-29`)
  • 嗯,无法在 TeraData atm 上对其进行测试,但这给出了什么日期?:select DATE '2020-02-29' - INTERVAL '2' YEAR as dt
  • 它不返回数据,而是返回一个 Invalid date 错误(愚蠢的标准 SQL 计算返回显然不存在的 2018-02-29)。
  • @dnoeth 感谢您的洞察力帮助。 :) 因为它只是计算前一年减去一个数字似乎是最好的选择。
  • 其他 DBMS 不遵循标准 SQL :-) 而且您的新计算确实容易得多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-11
  • 1970-01-01
  • 2014-11-16
相关资源
最近更新 更多