ANSI Casting Timestamp Netezza - конвертировать SQL из Teradata - PullRequest
1 голос
/ 06 декабря 2011

В настоящее время я не знаю ANSI, эквивалентного ключевому слову Teradata FORMAT для преобразования меток времени и типов данных в требуемые форматы представления. Я знаю, что это можно сделать с помощью to_char, to_date, как отдельные функции базы данных, но я хочу написать в ANSI, чтобы в будущем я мог легко перемещать код, выполняющийся из одной БД в другую. Ниже приведен текущий SQL-код Teradata, который я пытаюсь преобразовать в ANSI, чтобы я мог запустить его на 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, если таковые имеются? Пожалуйста, помогите.

Ответы [ 2 ]

1 голос
/ 16 января 2012

Вы можете попробовать функцию EXTRACT (). YMMV, но большинство современных РСУБД поддерживают его. Здесь действительно нет хорошего ответа - каждая СУБД обрабатывает проблемы «форматирования даты» по-своему и запутанно.

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)) 
0 голосов
/ 20 декабря 2011

В 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 и т. Д.

...