【问题标题】:Converting Varchar into Date in data type将 Varchar 转换为数据类型中的 Date
【发布时间】:2014-01-19 16:13:42
【问题描述】:

我对 SQL Server 比较陌生,所以我想知道如何将数据类型从 varchar 转换为 date 格式?我有几千条记录,所以我需要一个查询来帮助在单个查询中将 varchar 转换为 date

我有这种格式的日期:yyyymmddvarchar(8),我想把它转换成yyyymmdddate 格式。

有什么问题可以帮助我解决这个问题吗?

【问题讨论】:

  • DATE 数据类型没有任何 格式 - 它只是一个 5 字节的二进制值。

标签: sql sql-server sql-server-2008 select type-conversion


【解决方案1】:

只需使用这个内置的CONVERT 函数,然后检查这个Link 来格式化日期

-- Use 101 if you have divider in your date
SELECT convert(datetime, '2014-01-02',101) as [DateTime]

-- Use 112 if you don't have divider in your date
SELECT convert(datetime, '20140131',112) as [DateTime]  

已编辑:

UPDATE yourTable SET field = convert(datetime, 'yourFieldName',112)
--This will update all of your field regardless of any particular row
--If you want to update any particular set of rows use `WHERE` clause

如果您有更多不同的格式,请转到给定的链接。

【讨论】:

  • 我以为他可能错过了,但现在都提供了
  • @Kirk 你好,我有一千多条记录,你上面的查询只能帮助我一个一个地做,我需要一个查询来一次做所有的事情并更新它们?你有什么好的建议吗?谢谢
  • 告诉我你到底想做什么?我会在这里重述。顺便说一句,而不是 20140131 替换为您的字段名称。例如:convert(datetime, 'fieldName',112)
  • @Kirk 感谢您的询问,它运行良好。我不想选择它,而是想更新它。可以更新吗?
【解决方案2】:

有关 VARCHAR 和 DATETIME 之间的各种转换,请查看 this link

实际上,在您的情况下,由于您的 VARCHAR 是 yyyymmdd 格式,您可以:

convert(datetime, YourVarcharDateField, 112)

【讨论】:

  • 这个查询我试过了,但是在我的sql server中不能用,你还有什么好的建议吗?
  • 这是错误'Msg 241, Level 16, State 1, Line 2 Conversion failed when convert date and/or time from string.'
  • 那么你有一些不是'yyyyMMdd'格式的值。你能运行一个像SELECT YourVarcharDateField WHERE LEN(YourVarcharDateField)<>8 这样的查询,看看它能得到什么。
  • 上述错误显示以下之一:1)您的数据未采用上述格式; 2) 列中有NULL 值; 3)您的栏目中没有相关数据(其他文字信息)。在这种情况下,您只需过滤 wrong(用于转换)行并决定如何处理它们。
【解决方案3】:
ALTER TABLE [dbo].[table] ADD ConvertedDate Date
UPDATE [dbo].[SysData] SET ConvertedDate = CAST(VarCharDate as Date)
ALTER TABLE [dbo].[table] DROP COLUMN VarCharDate

【讨论】:

  • 从 SQL Server 2008 及更新版本开始,如果您只有日期(没有时间),我建议使用 DATE,或者如果您使用 DATETIME2(x)需要日期和时间。避免使用 DATETIME - 它已被弃用并且有弱点(例如 3.33 毫秒的精度)
  • @mr_eclair 这个查询我试过了,但是在我的sql server中不能用,你还有什么好的建议吗?
【解决方案4】:

数据类型可以隐式或显式转换。 隐式转化对用户不可见。 SQL Server 自动将数据从一种数据类型转换为另一种数据类型。例如,当将 smallint 与 int 进行比较时,smallint 会在比较继续之前隐式转换为 int。

显式转换使用 CAST 或 CONVERT 函数。

CAST 和 CONVERT 函数将值(局部变量、列或其他表达式)从一种数据类型转换为另一种数据类型

convert(datetime, '2013-05-04',101)

CAST ( expression AS data_type )

【讨论】:

  • 我有一千多条记录,你上面的查询只能帮我一一做,我需要一个查询一次做所有事情并更新它们?你有什么好的建议吗?谢谢
【解决方案5】:

使用CAST OR CONVERT函数将字符串转换为日期

试试这个:

SELECT CAST('20140102' AS DATE) AS convertedDate;
SELECT CAST(colName AS DATE) AS convertedDate FROM tableA;  -- Replace column name and table name

SELECT CONVERT(DATE, '20140102', 112) AS convertedDate;
SELECT CONVERT(DATE, colName, 112) AS convertedDate FROM tableA;  -- Replace column name and table name
两个查询的

输出

|convertedDate|
|-------------|
|2014-01-02   |

【讨论】:

  • 您好,我有一千多条记录,您上面的查询只能帮我一个一个地做,我需要一个查询来一次做所有事情并更新它们?你有什么好的建议吗?谢谢
  • @user3146242 我刚刚给你举了一个例子。使用此功能可以转换所有记录
  • @user3146242 检查我更新的答案。它适用于表中的所有记录
  • 感谢您的回复,但我还是不能很好地执行它,它显示'Msg 241, Level 16, State 1, Line 1 Conversion failed when conversion of date and/or time from string.'
  • @user3146242 不客气。根据我的说法,您的表中有一些记录不符合yyyyMMdd 格式。因此,您会遇到错误。尝试查找该记录并从查询中排除该记录
【解决方案6】:

在 SQL SERVER 中,有两种类型的内置转换技术。

  1. 转换
  2. 演员表

转换具有自己的默认值,因此在 SQL SERVER 的升级版本中将过时 更好地利用 CAST 转换技术

在您的场景中。已经有数据类型为 Varchar(8) 的日期试图转换为日期

系统地解决。

在现有表中添加一个新列。

Alter Table Table_name Add changedDataTypeDate Date

将 varchar 数据类型中的值更新为日期数据类型

UpDate Table_name Set ChangedDataTypeDate = CAST(OriginalDataTypeDate as Date)

再次将新列名更改为旧列名。

Sp_Rename 'Tablename.changedDataTypeDate','OriginalDataTypeDate','COLUMN'

完成了。

根据您的要求。

Alter Table customer Add Purchase_Changedtype Date
Update Customer set Purchase_changedtype = CAST(Purchase_date as Date) 

(如果你需要时间也替换日期时间而不是日期)

Alter table Customer Drop column Purchase_date
Sp_Rename 'Customer.Purchase_ChangedType','Purchase_Date','Column'

【讨论】:

  • 我对您的查询感到困惑,您介意我提供我的表名、列名来帮助我吗?我的表名是客户,我的列名是购买日期
猜你喜欢
  • 2019-08-17
  • 2023-04-07
  • 2014-03-09
  • 1970-01-01
  • 2020-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多