0

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

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

4

2 回答 2

2

下面是一些 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值。你有你使用TRIM()周围EXTRACT来摆脱添加转换DATEPARTCHAR数据类型的空白。Teradata 的日期很有趣,通常需要双精度CAST()才能将事情整理好。

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

于 2013-01-22T00:03:02.063 回答
1

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 作为参数发送到您的查询。

于 2013-01-22T01:20:35.853 回答