2017-04-04 59 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