【问题标题】:Date range comparison using varchar columns in Teradata使用 Teradata 中的 varchar 列进行日期范围比较
【发布时间】:2013-01-05 03:13:18
【问题描述】:

我的任务是从表单前端获取日历日期范围值,并将其用于在没有日期时间列的 Teradata 表中提供查询等。相反,日期是从两个 varchar 列聚合的:一个用于年份(CY = 当前年份,LY = 去年,LY-1 等),另一个用于格式为 MonDD 的日期(如 Jan13、Dec08 等)。

我将 Coldfusion 用于表单和结果页面,因此我能够动态创建查询,但我想不出一个适用于所有可能情况的好方法。有任何想法吗?即使撇开年份差异不谈,除了查询中可能存在大量单独的 OR 语句的范围内的每一天的直接比较之外,我想不出任何其他东西。我对 SQL 知识很了解 - 也许有更好的方法在 SQL 本身中编写脚本,使用两个 varchar 列上的某种转换来形成一个实际的日期范围,然后可以进行日期比较?

【问题讨论】:

  • 试着修改你的问题:)
  • 您要查询的Teradata表的结构(列名和数据类型)是什么?
  • 您能否提供您正在寻找的数据和结果的样本?
  • 它是什么类型的数据库? sql服务器?甲骨文?别的东西?还是 Teradata 是一种 db?

标签: sql coldfusion teradata


【解决方案1】:

下面是一些 SQL,它将获取 VARCHAR 日期值并对其执行一些基本操作以帮助您入门:

SELECT CAST(CAST('Jan18'||TRIM(EXTRACT(YEAR FROM CURRENT_DATE)) AS CHAR(9)) AS DATE FORMAT 'MMMDDYYYY') AS BaseDate_
     , CASE WHEN Col1 = 'CY'
            THEN BaseDate_
            WHEN Col1 = 'LY'
            THEN ADD_MONTHS(BaseDate_, -12)
            WHEN Col1 = 'LY-1'
            THEN ADD_MONTHS(BaseDate_, -24)
            ELSE BaseDate_
       END AS DateModified_
  FROM {MyDB}.{MyTable};

EXTRACT() 函数允许您拆分DATETIMETIMESTAMP 值。 您在EXTRACT 周围使用TRIM() 来消除将DATEPART 转换为CHAR 数据类型时添加的空格。 Teradata 的日期很有趣,而且通常需要双精度 CAST() 才能解决问题。

CASE 语句仅采用您建议使用的编码值,并使用ADD_MONTHS() 函数来操作日期。日期在 Teradata 中为 INTEGER,因此您还可以向它们添加 INTEGER 值以将日期移动一整天。与 Oracle 不同,您不能添加小数值来操作 TIMESTAMPTIME 部分。 DATE != TIMESTAMP 在 Teradata 中。

【讨论】:

  • 谢谢罗伯。这就是我要找的!现在我只需要在某处根除 MMMDD 列中的错误日期数据。
  • 啊,“坏数据”只是我在这个操作中必须更加小心闰年/Feb29。
【解决方案2】:

Rob 给了你一个 sql 方法。或者,您可以使用 ColdFusion 为您拥有的列生成值。这样的事情可能会奏效。

sampleDate = CreateDate(2010,4,12);  // this simulates user input

if (year(sampleDate) is year(now())
    col1Value = 'CY';
else if (year(now()) - year(sampleDate) is 1)
    col1Value = 'LY'
else
    col1Value = 'LY-' & DateDiff("yyyy", sampleDate, now());

col2Value = DateFormat(sampleDate, 'mmmdd');

然后您将 col1Value 和 col2Value 作为参数发送到您的查询。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-26
    • 1970-01-01
    • 2017-12-31
    • 1970-01-01
    相关资源
    最近更新 更多