2013-10-05 62 views
1

我有一个包含两个日期列的表。但是这些列在varchar中。我需要将它们转换为日期格式。将varchar转换为sql服务器中的日期格式

的样本数据是这样的:

户口号码|注册日期|系统状态更改日期

01740567715 | 10-JUL-13 | 30-JUL-13 12.53.32.000000000 PM

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

登记日期,我使用此代码:

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

但它shwoing结果为varchar,也显示错误的格式。

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

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

两者都转变为某种类型的日期格式(不是我预期的格式),但表结构,他们仍显示为VARCHAR。

我在这里做错了什么?

+2

表数据类型仍然是varchar。更新会更改存储的字符串,但它不会奇迹般地更改数据类型。 –

+0

@AaronBertrand:那么我必须运行一个选择查询并在那里转换日期? –

+0

不,您需要在数据正确时更改列的数据类型。 –

回答

3

您需要更改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 
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中的字符串。你什么也得不到,你输了很多。

相关问题