2016-07-29 55 views
0

我在Linux工作站上使用SQLite3。在一個表(A)中,有一個日期字段(YYYY-MM-DD),而在另一個表格(B)中,我需要將同一日期分成三個字段(日,月,年)。SQLite幫助:需要將表中的日期字段分成另一個表中的三個字段

CREATE TABLE A (
ID char(6), 
Date date 
); 

CREATE TABLE B (
ID char(6), 
Date_Day int(2), 
Date_Month int(2), 
Date_Year int(4) 
); 

INSERT INTO A (ID, Date) VALUES (1,'2016-07-13'); 
INSERT INTO A (ID, Date) VALUES (2,'2013-06-01'); 
INSERT INTO A (ID, Date) VALUES (3,'2015-05-20'); 

INSERT INTO B (ID) VALUES (1); 
INSERT INTO B (ID) VALUES (2); 
INSERT INTO B (ID) VALUES (3); 

以下腳本產生「無法獲取未定義或空引用的屬性'子字符串」錯誤。如果我刪除了INSERT INTO,並且只運行下面的腳本的選擇部分,那麼無論如何我都會得到NULL值,它不起作用。

INSERT INTO B (
Date_Day, 
Date_Month, 
Date_Year 
) 
SELECT ID,strftime('%d',Date), 
strftime('%m',Date), 
strftime('%Y',Date) 
FROM A 

WHERE A.ID = B.ID; 

任何意見,將不勝感激。 TIA

+0

該錯誤不是來自SQLite,而是來自您用來訪問它的任何語言。 –

回答

0

假設日期字符串一直格式YYYY-MM-DD,你可以用下面的語句:

INSERT INTO B (ID, Date_Day, Date_Month,Date_Year) 
SELECT ID, SUBSTR(date,1,4)*1, SUBSTR(date, 6,2)*1, SUBSTR(date,9,2)*1 FROM A; 

SUBSTR函數記錄在這裏: SQL As Understood By SQLite/Core Functions

乘法1強制SQLite將字符串轉換爲整數字段。

+0

* strftime *是SQLite的[日期和時間函數](http://www.sqlite.org/lang_datefunc.html)的一部分 – inukshuk

+0

我站好了,你是對的,仍然,答案是有效的。我承認,你的回答比較好,並得到我的投票。 – Zuppa

1

您的INSERT INTO B與以下SELECT參考B.ID沒有任何意義;您可能想要做的是UPDATE B而不是(因爲您已經預先插入了具有相應ID的行)。但是,我建議你使用觸發器插入到A中,將相應的值插入到B中。實際上,B是完全多餘的,所以我會質疑它是否真的有意義使用B - 當你需要它們時(或者將B定義爲視圖等)計算B中的值可能會更好。

無論如何,如果你真的需要 B,就像我說的,你可以使用這樣的觸發器:

> CREATE TABLE A (id INTEGER PRIMARY KEY, date); 
> CREATE TABLE B (
~ id INTEGER PRIMARY KEY REFERENCES A ON DELETE CASCADE, 
~ day, 
~ month, 
~ year 
~); 
> CREATE TRIGGER insert_a 
~ AFTER INSERT ON A 
~ BEGIN 
~  INSERT INTO B (id, day, month, year) 
~  VALUES (
~  NEW.id, 
~  strftime("%d", NEW.date), 
~  strftime("%m", NEW.date), 
~  strftime("%Y", NEW.date) 
~ ); 
~ END; 
> INSERT INTO A (date) VALUES ('2016-07-13'); 
> select * from A; 
id   date  
---------- ---------- 
1   2016-07-13 
> select * from B; 
id   day   month  year  
---------- ---------- ---------- ---------- 
1   13   07   2016  

如果你曾經在一個更新值還需要定義一個觸發器更新。

相關問題