2017-09-05 81 views
0

我想更新我的日期列,需要添加35秒。我用這個查詢:oracle,sql日期函數

UPDATE temp_table SET dpdate = dpdate + 35/86400 ; 

這裏的問題是:

EXISTING    AFTER Update 
-------------------- -------------------- 
02-JUN-2017 02:06:13 02-JUN-2017 02:06:48 
02-JUN-2017 02:06:14 02-JUN-2017 02:06:49 
19-MAY-2017 02:05:47 19-MAY-2017 02:05:22 

注:我跑了上面的查詢,以及下面的所有結果都是運行更新查詢後。

在前兩行中,它工作正常,但在最後一行中,它應該來到02:06:22,但它是02:05:22

當我按日期訂購時,19-MAY-2017 02:05:47先來,然後19-MAY-2017 02:05:22

不知道爲什麼分鐘字段沒有增加,以及如何排序,19-MAY-2017 02:05:47排在第一位。

A 01-DEC-2014 12:12:00 
C 01-DEC-2014 12:12:35 

A 01-JUL-2016 05:07:33 
C 01-JUL-2016 05:07:08 

A 29-JAN-2016 04:01:08 
C 29-JAN-2016 04:01:43 

A 26-FEB-2016 04:02:09 
C 26-FEB-2016 04:02:44 

A 11-MAR-2016 03:03:13 
C 11-MAR-2016 03:03:48 

A 08-APR-2016 04:04:35 
C 08-APR-2016 04:04:10 

我的問題:

的順序由前四個是正確的,但你可以看到與去年2問題的幾個例子,爲什麼分鐘字段不更新?

回答

0

您確定您的操作正常嗎?

檢查此查詢,它的做工精細,分鐘被改變:

select current_date,current_date + 35/86400 from dual 
4

我敢打賭,你使用:to_char(dpdate, 'dd-MON-yyyy hh24mmss')顯示日期(可能是,或你的NLS_DATE_FORMAT參數已更改與格式掩碼) - 請注意時間部分中的mmmm用於獲取月份編號,而您可能需要mi才能獲得分鐘。

例如爲:

WITH sample_data AS (SELECT to_date('02-JUN-2017 02:06:13', 'dd-MON-yyyy hh24:mi:ss') dpdate FROM dual UNION ALL 
        SELECT to_date('02-JUN-2017 02:06:14', 'dd-MON-yyyy hh24:mi:ss') dpdate FROM dual UNION ALL 
        SELECT to_date('19-MAY-2017 02:05:47', 'dd-MON-yyyy hh24:mi:ss') dpdate FROM dual) 
SELECT to_char(dpdate, 'dd/mm/yyyy hh24:mi:ss') dpdate, 
     to_char(dpdate + 35/(24*60*60), 'dd/mm/yyyy hh24:mm:ss') incorrect_new_dpdate_display, 
     to_char(dpdate + 35/(24*60*60), 'dd/mm/yyyy hh24:mi:ss') correct_new_dpdate_display 
FROM sample_data; 

DPDATE    INCORRECT_NEW_DPDATE_DISPLAY CORRECT_NEW_DPDATE_DISPLAY 
------------------- ---------------------------- -------------------------- 
02/06/2017 02:06:13 02/06/2017 02:06:48   02/06/2017 02:06:48 
02/06/2017 02:06:14 02/06/2017 02:06:49   02/06/2017 02:06:49 
19/05/2017 02:05:47 19/05/2017 02:05:22   19/05/2017 02:06:22 
+0

謝謝,這個作品! :)我正在使用MM而不是MI。 – jaya

0

你可以使用INTERVAL

UPDATE temp_table SET dpdate = dpdate + INTERVAL '35' SECOND; 

Oracle 11g這工作得很好,並更新分鐘爲好。與算術表達式相比,它也更容易閱讀。