2015-10-18 63 views

回答

2

是的,你可以在不寫UDF的情況下做到這一點。如果您在日期時間函數下查看Hive documentation,則有一個函數from_unixtime(),它具有unix時間戳和字符串模式。在文檔頁面上有幾個函數,有一個link,它解釋了您可以在此函數中使用的不同模式。因此,從您的時間戳中,您可以提取一週中的某一天並據此進行操作。

示例數據

1445313193 
1445313100 
1445313146 
1445040000 
1445040023 
1445040111 

前三個是星期一,2015年10月19日和最後三個週五,2015年10月16日。

查詢

select day_of_week 
    , date_var 
    , case when day_of_week = 'Sun' then date_var 
    when day_of_week = 'Sat' then date_sub(date_var, 6) 
    when day_of_week = 'Fri' then date_sub(date_var, 5) 
    when day_of_week = 'Thu' then date_sub(date_var, 4) 
    when day_of_week = 'Wed' then date_sub(date_var, 3) 
    when day_of_week = 'Tue' then date_sub(date_var, 2) 
    when day_of_week = 'Mon' then date_sub(date_var, 1) 
    else NULL 
    end as first_day_of_week_date 
from (
    select from_unixtime(timestamp, 'EEE') day_of_week 
    , from_unixtime(timestamp, 'yyyy-MM-dd') date_var 
    from db.table) A 

輸出

Mon 2015-10-19 2015-10-18 
Mon 2015-10-19 2015-10-18 
Mon 2015-10-19 2015-10-18 
Fri 2015-10-16 2015-10-11 
Fri 2015-10-16 2015-10-11 
Fri 2015-10-16 2015-10-11 

所以,今天是昨天,這是週日返回,和上週五,它返回以前的週日,第11位。我假設「一週的第一天」是指星期天;如果沒有,您可以將代碼調整爲星期一。希望這可以幫助。

4

DATE_SUB(m.invitationdate,PMOD(DATEDIFF(m.invitationdate, '1900年1月7日'),7))

此表達產生了我的問題精確解。

問候,

鮑里斯

0

這是最簡單和獲取一週的日期的第一天最好的解決辦法:

對於當前timstamp:

select date_sub(from_unixtime(unix_timestamp()), cast(from_unixtime(unix_timestamp(), 'u') AS int)) ; 

對於任何給定日期或欄目:

select date_sub(from_unixtime(unix_timestamp('2017-05-15','yyyy-MM-dd')), cast(from_unixtime(unix_timestamp('2017-05-15','yyyy-MM-dd'), 'u') AS int)) ; 

select date_sub(from_unixtime(unix_timestamp(colname,'yyyy-MM-dd')), cast(from_unixtime(unix_timestamp(colname,'yyyy-MM-dd'), 'u') AS int)) ; 
相關問題