我有一个包含两个日期列的表。但是列是varchar。我需要将它们转换为日期格式。
示例数据如下:
帐号|注册日期|系统状态更改日期
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)
但是它将结果作为varchar并且显示错误的格式。
对于系统状态更改日期我使用以下代码:
update [dbo].[SysData]
Set ["KYC_STATUS_CHANGED_DATE"]= REPLACE(CONVERT(datetime,convert(datetime,left(["KYC_STATUS_CHANGED_DATE"],9),103),106),' ' ,'-')
两者都改为某种类型的日期格式(不是我期望的格式),但在表格结构中它们仍显示为varchar。
我在这里做错了什么?
答案 0 :(得分: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中的字符串。你什么都得不到,你失去了很多。
答案 1 :(得分: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