简体   繁体   English

ANSI Casting Timestamp Netezza-从Teradata转换SQL

[英]ANSI Casting Timestamp Netezza - convert SQL from Teradata

I currently do not know ANSI equivalent to Teradata FORMAT key word for converting timestamp, date data types into our required representation formats. 我目前不知道将Terstdata FORMAT关键字转换成我们所需的表示格式的ANSI,它相当于Teradata FORMAT关键字。 I know this can be done with to_char, to_date like individual database specific functions, But I want to write in ANSI so that in future I can easily move code running from one DB to another. 我知道可以像单独的数据库特定函数一样使用to_char,to_date完成此操作,但是我想用ANSI编写,以便将来我可以轻松地将运行代码从一个DB移动到另一个DB。 Below is the current Teradata SQL I am trying to convert into ANSI so that I can run it on both Teradata ,Netezza and Vertica etc. 下面是我正在尝试转换为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
;

Currently I don't know how to translate the FORMAT 'HHMISS', FORMAT '-9(5)' into ANSI. 目前,我不知道如何将FORMAT'HHMISS'和FORMAT'-9(5)'转换为ANSI。 Is there any documentation on this possible ANSI equivalent functions if any? 有没有关于此可能的ANSI等效函数的文档(如果有)? Please help. 请帮忙。

You can try the EXTRACT() function. 您可以尝试EXTRACT()函数。 YMMV, but most modern RDBMS's support it. YMMV,但是大多数现代RDBMS都支持它。 There's really no good answer here - every DBMS handles "date formatting" issues differently and confusingly. 这里确实没有很好的答案-每个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)) 

In Teradata you should be able to do the following: 在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;

Another option to try: 尝试的另一种选择:

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;

My experience has been that you have to treat dates and timestamps differently with each database. 我的经验是,您必须对每个数据库分别对待日期和时间戳。 One solution may not be universally accepted. 一种解决方案可能不会被普遍接受。 But I'd love to see something that works in Teradata, Oracle, SQL Server, MySQL, etc. 但是,我很乐意看到一些可在Teradata,Oracle,SQL Server,MySQL等中运行的东西。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM