2017-07-28 5 views
1

ハイブ環境でクエリを実行しています。string to date - ハイブSQL

タイムスタンプを持つ列がありますが、テーブルに文字列が設定されています。私は、次のことを試してみました:それらのすべてを返すヌル

SELECT 
,To_date(activitydate) 

出演:

,cast(activitydate as timestamp) 

これは、データがテーブルに設定されている方法です。

は、どのように私ができる上の任意の入力に感謝します

:私はこれを実行する場合、私はメモリが不足しています
05/12/2017 00:00:00  



SELECT 
cust_id 
,to_date(activitydate) activity_date 
,type type_of_contact 


FROM repl_task 

WHERE to_date(activitydate) BETWEEN '2014-01-01' AND '2017-01-01' ; 

:これを変換します
SELECT 
cust_id 
,activitydate 
,SUBSTR(activitydate,4,2) AS DT 
,SUBSTR(activitydate,0,2) AS MONTH 
,SUBSTR(activitydate,7,4) AS YEAR 
,type 


FROM task 

WHERE activitydate >='01/01/2016 00:00:00' 
+0

はなぜ正確に日付が必要なのでしょうか?完全なクエリを表示できますか? –

+0

私は3年だけのデータが必要な場合はテーブルをフィルタリングする必要があります。そうでない場合は、25年間のデータがあります。 – sai

+0

以下は私が使用している回避策です: – sai

答えて

1

unix_timestamp機能は、UNIXタイムスタンプに形式を変換し、与えられたfrom_unixtime関数は、指定した形式にUNIXタイムスタンプから変換します

hive> select from_unixtime(unix_timestamp('01/01/2016 00:00:00','MM/dd/yyyy HH:m:ss'),'yyyy-MM-dd'); 
OK 
2016-01-01 
Time taken: 0.118 seconds, Fetched: 1 row(s) 
1

あなたはISO形式でタイムスタンプの日付部分とto_date()を使用して試すことができます:

SELECT 
    cust_id, 
    TO_DATE(CONCAT(SUBSTR(activitydate, 7, 4), '-', 
        SUBSTR(activitydate, 0, 2), '-', 
        SUBSTR(activitydate, 4, 2))) activity_date 
    type type_of_contact 
FROM repl_task 
WHERE 
    TO_DATE(CONCAT(SUBSTR(activitydate, 7, 4), '-', 
        SUBSTR(activitydate, 0, 2), '-', 
        SUBSTR(activitydate, 4, 2))) 
     BETWEEN '2014-01-01' AND '2017-01-01'; 

これが実行されますが、非常にパフォーマンスではない場合、あなたはISO形式でタイムスタンプを保存する検討すべきです。日付をテキストとして保存するか、非標準形式のテキストとして保存すると、ほとんどのデータベースでペナルティが発生します。

+0

メモリの問題 – sai

+0

私が言及したように、日付型を扱うか、文字列を使用してISO形式を使用する必要があります。サブクエリを使用して私の答えをリワードすることもできます。 –