Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Teradata SQL上一年同一天同一周_Sql_Teradata - Fatal编程技术网

Teradata SQL上一年同一天同一周

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

需要帮助了解如何确定日期是否与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_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开销的影响,因为它的数学、转换和表更少。