Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 使用cast(日期为datetime)更新会产生不同的结果_Sql Server - Fatal编程技术网

Sql server 使用cast(日期为datetime)更新会产生不同的结果

Sql server 使用cast(日期为datetime)更新会产生不同的结果,sql-server,Sql Server,我对此表示怀疑 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 为什么会这样

我对此表示怀疑

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
为什么会这样?我记得是这样的

May 28 1974 12:00AM
SET *Some code i forgot* 120
我怎么能退后? 编辑:

对于记录,我的
date
列位于
varchar(20)
中,我不知道为什么,但该公司希望它建立一个新的数据库/标准化,并拥有10万条记录。我了解到,如果date列中的所有数据设置为
yyyy-mm-dd
格式,您可以将该列更改为
datetime
这里有两个问题

  • 首先,您的
    日期
    字段是什么类型的?如果它确实是
    datetime
    ,则它通常会显示您观察到的日期和时间

  • 其次,尽管
    date
    类型比完整的
    datetime
    类型简单,但有效时间是一天开始时的午夜。因此,如果您将一个简单的
    date
    字段转换为
    datetime
    类型,那么您将得到日期加午夜

如果确实希望按列表输出日期,请使用
cast date as date)
。为了明确目的,您可以使用
将“date”转换为date
,以明确第一次使用
date
是列名

关于将数据设置回旧值,欢迎来到奇妙的SQL世界,这里没有撤销。SQL Server确实能够在一定程度上进行恢复,但并不总是那么容易

这有点令人困惑,因为
date
指的是字段类型以及其中一列的名称

如果要将日期的更正版本改装到现有字符字段中,可以尝试:

UPDATE maindb SET date=cast(cast(date as date) as char);
DATETIME
添加了时间组件。因此,当您将目标转换为时,它将在凌晨12:00初始化。要解决您的问题,请执行以下操作:

  • 创建日期类型为的新列
  • 将现有列强制转换为
    date
    datatype到新列
    updatemaindb SET date=cast(日期为date),其中日期为“%1974%”
  • 删除旧列
  • 重命名新列

  • 首先添加一列并存储转换的日期

     select *, convert(datetime, date) as new_date from maindb  WHERE date LIKE'%1974%'
    
    然后更新到相应列的主表中

    UPDATE maindb
     SET date  = new_date    
    


    之所以出现此“错误”,是因为
    date
    字段是字符类型(例如varchar(20))。将日期时间强制转换为字符类型的默认格式为0(或100)。您忘记的代码正在将其转换为120格式,例如从maindb选择CONVERT(VARCHAR(20),date,120)。有关类型转换的信息,请参阅上的“日期和时间样式”。是的,我知道它是一个varchar。但是这个表已经有了10万条记录。因此,我希望将其转换为正确的
    datetime
    日期字段位于
    string
    中,如果我忘记了,很抱歉tell@Wowie使用字符串类型不是一个好主意。
    cast
    仍应有效。你的专栏里有什么数据,你想要什么结果?对不起,那个数据库来自老公司。因此,我正在将其迁移到新的ok表我不想要的结果是这是
    1974年5月28日12:00AM
    ,这当然是
    select*from maindb
    的结果我想要一个适合
    datetime
    类型的正确结果。我尝试了
    更新maindb SET date=cast(date as date),其中的日期像“%1973%”这样,它工作了!我不知道为什么,
    convert(date,datetime)
    没有?它仍然显示
    1974年5月28日12:00AM
    @Wowie我尝试了第一个,它工作正常我使用了这个
    updatemaindb SET date=cast(cast(date as date)as char),其中日期像“%1974%”