2012-01-19 20 views
2

我想我遇到了MySQL 5.1的一個bug,但是這個錯誤發生在創建時間戳的perl代碼中。 perl的本地時間使用0-11個月,但MySQL的日期時間使用1-12。所以,我有所有這些格式不正確的時間戳,我需要更新。MySQL - 我的月份是當前存儲的0-11

2012-00-19 09:03:30 

這應該是:

2012-01-19 09:03:30 

的問題是,在00個月的MySQL返回NULL日期函數。有沒有辦法在MySQL中做到這一點?

編輯:解=

UPDATE test_stats 
SET start_time = CAST(CONCAT(SUBSTRING(start_time, 1, 5), 
         CAST((CAST(SUBSTRING(start_time, 6, 2) AS UNSIGNED) + 1) AS CHAR(2)), 
         SUBSTRING(start_time, 8, 12)) AS DATETIME); 

順便說一句,我採用的是MySQL 5.1

+2

OK ,我喜歡Perl,但是誰認爲這是一個惡作劇d想法到零指數月份? –

+0

您可以嘗試在MySQL中使用[dateadd](http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_date-add)函數將月份添加到每個條目。我不確定在空例中會發生什麼;你必須在MySQL命令行上試試才能發現。 –

+1

Perl的gmtime/localtime本質上以Unix的struct tm作爲其參數,struct tm具有零索引的月份。這是一個相當臭名昭着的Perl陷阱,但它確實是Unix的錯。 – pndc

回答

3

這應該工作:

UPDATE MyTable 
SET DateTimeField = 
    CAST (
    SUBSTRING(DateTimeString, 1, 5) -- '2012-' 
    + CAST((CAST(SUBSTRING(DateTimeString, 6, 2) AS INT) + 1) AS VARCHAR) -- '00' => '1' 
    + SUBSTRING(DateTimeString, 8, 12) -- '-19 09:03:30' 
    AS DATETIME) 

測試這個選擇

DECLARE @x VARCHAR(50) = '2012-00-19 09:03:30' 

SELECT CAST(SUBSTRING(@x, 1, 5) 
    + CAST((CAST(SUBSTRING(@x, 6, 2) AS INT) + 1) AS VARCHAR) 
    + SUBSTRING(@x, 8, 12) AS DATETIME) 
+0

因此,這將更新任何00個月,對吧?爲了遞增所有月份值,因爲它們全部當前以0-11存儲,我首先必須更新並且每增加非00月份,對吧? – kjprice

+0

是的,這會增加月份0 => 1,1 => 2,....,11 => 12 –

+0

讓我們來看看,我可以先測試一下select SELECT CAST(SUBSTRING(DateTimeString,1, 5) - '2012-'+ CAST((CAST(SUBSTRING(DateTimeString,6,2)AS INT)+ 1)AS VARCHAR)'00'=>'1'+ SUBSTRING(DateTimeString,8,12) - '-19 09:03:30'AS DATETIME)FROM MyTable; ? – kjprice

相關問題