1

我有一个有两个日期列的表。但是,这些列是 varchar。我需要将它们转换为日期格式。

样本数据如下:

帐号 | 注册日期 | 系统状态更改日期

01740567715 | 2013 年 7 月 10 日 | 2013 年 7 月 30 日 12.53.32.000000000 下午

我希望这两列都像这样:2013 年 7 月 10 日。

对于注册日期,我使用的是以下代码:

Update [dbo].[SysDataV2] 
Set ["REGISTRATION_DATE"]= convert(datetime, (["REGISTRATION_DATE"]), 106)

但它将结果显示为 varchar 并且还显示了错误的格式。

对于系统状态更改日期,我使用以下代码:

update [dbo].[SysData] 
Set ["KYC_STATUS_CHANGED_DATE"]= REPLACE(CONVERT(datetime,convert(datetime,left(["KYC_STATUS_CHANGED_DATE"],9),103),106),' ' ,'-')

两者都更改为某种类型的日期格式(不是我预期的格式),但在表结构中它们仍显示为 varchar。

我在这里做错了什么?

4

2 回答 2

4

表的数据类型仍然是 varchar。更新仅更改字符串,不会更改数据类型。您应该做的是(假设所有日期均有效且此格式 100% 一致):

UPDATE dbo.SysData SET REGISTRATION_DATE = 
 CONVERT(CHAR(10), CONVERT(DATE, REGISTRATION_DATE, 106), 120);

UPDATE dbo.SysData SET KYC_STATUS_CHANGED_DATE = 
   CONVERT(CHAR(10), CONVERT(DATETIME, LEFT(KYC_STATUS_CHANGED_DATE, 9), 106), 120) 
    + REPLACE(SUBSTRING(KYC_STATUS_CHANGED_DATE, 10, 9), '.',':') 
    + RIGHT(KYC_STATUS_CHANGED_DATE, 2);

ALTER TABLE dbo.SysData ALTER COLUMN REGISTRATION_DATE DATE;
ALTER TABLE dbo.SysData ALTER COLUMN KYC_STATUS_CHANGED_DATE DATETIME;

然后停止插入区域性和可能有问题的字符串。表示日期/日期时间的字符串文字应该是:

-- date only
YYYYMMDD

-- with time:
YYYY-MM-DDThh:mm:ss.nnn

但最好是在将它们交给 SQL Server 之前简单地确保它们是日期或日期时间值。您的应用程序应该能够做到这一点,而无需转换为任意字符串格式。永远不要将日期或日期时间值存储为 SQL Server 中的字符串。你一无所获,你失去了很多。

于 2013-10-05T15:52:36.657 回答
3

您需要将列的数据类型从 a 更改varchar为将其存储为Date. 然后,当您选择它时,您可以以任何您喜欢的方式对其进行格式化。一种方法是创建一个正确数据类型的新列并转换数据,然后删除旧列。确保旧列没有外键关系,否则您还需要将它们转移过来。

ALTER TABLE [dbo].[SysData] ADD ConvertedDate DateTime
UPDATE [dbo].[SysData] SET ConvertedDate = CAST(VarCharDate as DateTime)
ALTER TABLE [dbo].[SysData] DROP COLUMN VarCharDate
于 2013-10-05T15:55:30.303 回答