Teradata SQL上一年同一天同一周
需要帮助了解如何确定日期是否与teradata中的今天相同。也就是说,今天Teradata SQL上一年同一天同一周,sql,teradata,Sql,Teradata,需要帮助了解如何确定日期是否与teradata中的今天相同。也就是说,今天12/1/15周二,去年的同一天实际上是12/2/2014周二 我尝试使用current_date-INTERVAL'1'Year,但它返回12/1/2014下面的SQL将为您提供星期几的缩写名称,这很麻烦,但它可以跨Teradata版本工作 SELECT CAST(CAST(ADD_MONTHS(CURRENT_DATE, -12) AS DATE FORMAT 'E3') AS CHAR(3)) AS LY_DayOf
12/1/15周二
,去年的同一天实际上是12/2/2014周二
我尝试使用
current_date-INTERVAL'1'Year
,但它返回12/1/2014
下面的SQL将为您提供星期几的缩写名称,这很麻烦,但它可以跨Teradata版本工作
SELECT CAST(CAST(ADD_MONTHS(CURRENT_DATE, -12) AS DATE FORMAT 'E3') AS CHAR(3)) AS LY_DayOfWeek
, CAST(CAST(CURRENT_DATE) AS DATE FORMAT 'E3') AS CHAR(3)) AS CY_DayOfWeek
日期在Teradata内部用整数表示为
(1900年)*100000+(100个月)+天
。你可以做一些创造性的算术来计算出2015年1月12日星期二是去年的2014年2月12日星期二 如果您可以将当前日期的“星期几”转换为数字,将上一年的“星期几”转换为数字,那么您可以通过一点数学知识来实现这一点
为了在Teradata中实现这一点,您最好使用sys\u calendar.calendar
表。特别是每周的天
列。尽管有很多方法去做
此外,与其使用当前日期-间隔“1”年
,不如使用添加月份(当前日期-12)
,因为间隔
算法将在2012-02-29
和其他2月29日闰年日期失败
所以,把它放在一起,你就可以得到你所需要的:
SELECT
ADD_MONTHS(CURRENT_DATE, -12)
+
(
(SELECT day_of_week FROM sys_calendar.calendar WHERE calendar_date = CURRENT_DATE)
-
(SELECT day_of_week FROM sys_calendar.calendar WHERE calendar_date = ADD_MONTHS(CURRENT_DATE, -12))
)
这基本上是说:取当前日期的周数(3)并从中减去去年的周数(2),得到1。将其添加到去年的日期,您将拥有与当前日期相同的一周日期
我在
01/01/2010
和CURRENT\u DATE
之间的所有日期都进行了测试,结果与预期的一样。为什么不直接减去52周
current_date - 364
谢谢,我真的很关心2/29的日期,所以我不能直接使用当前的日期-364逻辑。老实说,减去52周在这里也同样有效。这基本上就是它所做的,它是以循环的方式进行的,您不会受到额外的I/O和CPU开销的影响,因为它的数学、转换和表更少。