1

我目前不知道 ANSI 等效于 Teradata FORMAT 关键字,用于将时间戳、日期数据类型转换为我们所需的表示格式。我知道这可以通过 to_char、to_date 来完成,就像个别数据库特定的函数一样,但我想用 ANSI 编写,以便将来我可以轻松地将运行的代码从一个数据库移动到另一个数据库。下面是我正在尝试转换为 ANSI 的当前 Teradata SQL,以便我可以在 Teradata、Netezza 和 Vertica 等上运行它。

SELECT
CAST( (MYTIME ( FORMAT 'DDMMYYYY')) AS CHAR( 8 ))         
|| CAST( (MYTIME (FORMAT 'HHMISS'))   AS CHAR(6))          
|| CAST(CAST(MYNUMBER  AS FORMAT'-9(5)') AS CHAR(5))             
FROM MYTABLE
;

目前我不知道如何将 FORMAT 'HHMISS'、FORMAT '-9(5)' 转换为 ANSI。如果有的话,是否有关于这种可能的 ANSI 等效函数的文档?请帮忙。

4

2 回答 2

1

您可以尝试 EXTRACT() 函数。YMMV,但大多数现代 RDBMS 都支持它。这里真的没有很好的答案——每个 DBMS 处理“日期格式”问题的方式都不同且令人困惑。

select 
case when extract(day from current_timestamp) < 10 then '0' else '' end || cast(extract(day from current_timestamp) as varchar(2)) ||
case when extract(month from current_timestamp) < 10 then '0' else '' end || cast(extract(month from current_timestamp) as varchar(2)) ||
cast(extract(year from current_timestamp) as varchar(4)) ||
case when extract(hour from current_timestamp) < 10 then '0' else '' end || cast(extract(hour from current_timestamp) as varchar(2)) ||
case when extract(minute from current_timestamp) < 10 then '0' else '' end || cast(extract(minute from current_timestamp) as varchar(2)) ||
case when extract(second from current_timestamp) < 10 then '0' else '' end || cast(extract(second from current_timestamp) as varchar(2)) 
于 2012-01-16T16:12:54.603 回答
0

在 Teradata 中,您应该能够执行以下操作:

/* The double cast is to truncate any time value associated with MyTime */
SELECT CAST(CAST(MyTime AS DATE) AS TIMESTAMP(6)) 
     + ((MyTime - TIME '00:00:00') HOUR to SECOND(6)) AS MyTimeStamp_
  FROM MyTable;

另一个尝试的选择:

SELECT CreateTimeStamp
     , CAST((CreateTimeStamp (TIMESTAMP(6), FORMAT 'DDMMYYYYBHHMISS.S(6)')) AS CHAR(22)) AS MyTimeStamp_
     , CAST((CreateTimeStamp (TIMESTAMP(6), FORMAT 'DD-MM-YYYYBHH:MI:SS.S(6)')) AS CHAR(26)) AS MyTimeStamp2_
  FROM DBC.Databases
 WHERE DatabaseName = USER;

我的经验是,您必须对每个数据库以不同的方式处理日期和时间戳。一种解决方案可能不会被普遍接受。但我很想看到在 Teradata、Oracle、SQL Server、MySQL 等中工作的东西。

于 2011-12-20T19:16:40.847 回答