2017-04-04 28 views
0

我查詢這個更新與投(日期日期時間)給出不同的結果

UPDATE maindb SET date = CAST(date as DATETIME) WHERE date LIKE'%1974%' 

所以我期待的

date 
1974-12-12 
1974-12-13 
1974-12-14 

結果然而,當我查詢

select * from maindb where date like '%1974%' 

結果就是這樣

May 28 1974 12:00AM 

這是爲什麼?我記得有這樣的疑問

SET *Some code i forgot* 120 

我該如何退後? 編輯:
備案我的date列在varchar(20)我不知道爲什麼,但公司希望它到一個新的數據庫/正常化,並有100K記錄。我知道,如果所有date列中的數據被設置爲yyyy-mm-dd格式,您可以更改列datetime

+0

你得到這個「錯誤」,因爲你的'date'字段是一個字符類型(例如, VARCHAR(20))。將日期時間轉換爲字符類型默認爲格式0(或100)。您忘記的代碼將其轉換爲格式120,例如'SELECT CONVERT(VARCHAR(20),date,120)FROM maindb;'。有關類型轉換的信息,請參閱[本頁](https://docs.microsoft.com/zh-cn/sql/t-sql/functions/cast-and-convert-transact-sql)上的「日期和時間樣式」 。 – ZLK

+0

是的,我知道它是一個varchar。但是桌子已經有了100K的記錄。所以我希望它被轉換成適當的'datetime' – Wowie

回答

0

這裏有2個問題。

  • 首先,什麼類型的字段是你的date字段?如果它真的是datetime,那麼它通常會顯示日期和時間,如您所見。其次,儘管date類型比完整的datetime類型更簡單,但是有效時間是一天的午夜。因此,如果您將簡單的date字段投射到datetime類型,那麼您將獲得日期和午夜。

如果您確實想要列出日期,請使用cast date as date)。要明確意圖,可以使用cast "date" AS date來明確第一次使用date是列名稱。

至於設置數據回舊值,歡迎來到SQL的美好世界,在那裏沒有撤消。 SQL Server確實有一定的恢復能力,但這並不容易。

這有點讓人困惑,因爲date引用了一個字段類型以及您的某個列的名稱。

如果要加裝日期的修正版本到現有的字符域,你可以嘗試:

UPDATE maindb SET date=cast(cast(date as date) as char); 
+0

日期字段在'string'對不起,如果我忘記告訴 – Wowie

+0

@Wowie使用字符串類型不是一個好主意。 'cast'應該仍然有效。你有什麼數據在你的專欄中,你想要什麼結果? – Manngo

+0

很抱歉,該數據庫來自舊公司。所以我正在遷移到新的和確定的表 – Wowie

0

首先添加一列並存儲轉換日期

select *, convert(datetime, date) as new_date from maindb WHERE date LIKE'%1974%' 

然後更新到主表中相應的列

UPDATE maindb 
SET date = new_date  

UPDATE maindb 
SET date = convert(datetime, date, 100) WHERE date LIKE'%1974%' 
+0

它仍然顯示'5月28日1974年12:00上午' – Wowie

+0

@Wowie我試過第一個,它工作正常 – Chanukya

+0

我用這個'更新maindb SET日期=鑄(鑄(日期作爲日期)作爲字符)WHERE日期LIKE' %1974%';' – Wowie