我在SQL中有一个列,其中数据存储为102915,060315等。
该列的数据类型为nvarchar(50)
。我想将上述数据转换为日期格式。
应该看起来像10-29-15或10/29/15。
如何在SQL Server Management Studio 2008中转换上述内容?
尝试了很多事情:其中一个是
create view v1
as
Select
CAST([ISSUE] as date) as ISSUE,
CAST([EXPIRE] as date) as EXPIRE
from tablename
正在创建视图。
注意:ISSUE和EXPIRE是列名,其值为100515,060315,我需要将这些列中的所有值转换为10-05-15或10/05/15。
当我执行select * from v1;
时,我收到以下错误:
从字符串转换数据和/或时间时转换失败。
答案 0 :(得分:2)
你可以试试这个:
DECLARE @date VARCHAR(50) = '102915'
SELECT CAST( CAST( '20'+ --prefix for the year 2000
SUBSTRING( @date,5,2)+ --year
SUBSTRING( @date,1,2)+ --month
SUBSTRING( @date,3,2) --day
AS VARCHAR(10))
AS DATE)
结果:
但是这将假设你的日期都大于1999年。
由于您的日期格式为MMddYY,因此很难获得当年的正确日期部分。
因此,对于您的观点,您可以使用:
create view v1 as
Select CAST( CAST( '20'+ --prefix for the year 2000
SUBSTRING( [ISSUE],5,2)+ --year
SUBSTRING( [ISSUE],1,2)+ --month
SUBSTRING( [ISSUE],3,2) --day
AS VARCHAR(10))
AS DATE) as ISSUE
,
CAST( CAST( '20'+ --prefix for the year 2000
SUBSTRING( [EXPIRE],5,2)+ --year
SUBSTRING( [EXPIRE],1,2)+ --month
SUBSTRING( [EXPIRE],3,2) --day
AS VARCHAR(10))
AS DATE) as EXPIRE
from tablename
要以mm-dd-yyyy格式显示日期,您需要使用CONVERT,您可以看到不同的转化here:
create view v1 as
Select convert(VARCHAR ,CAST( CAST( '20'+ --prefix for the year 2000
SUBSTRING( [ISSUE],5,2)+ --year
SUBSTRING( [ISSUE],1,2)+ --month
SUBSTRING( [ISSUE],3,2) --day
AS VARCHAR(10))
AS DATE), 110) as ISSUE
,
convert(VARCHAR ,CAST( CAST( '20'+ --prefix for the year 2000
SUBSTRING( [EXPIRE],5,2)+ --year
SUBSTRING( [EXPIRE],1,2)+ --month
SUBSTRING( [EXPIRE],3,2) --day
AS VARCHAR(10))
AS DATE), 110) as EXPIRE
from tablename
答案 1 :(得分:0)
如果您使用的是SQL Server 2012,则可以使用DATEFROMPARTS函数。它需要三个int参数 - Year,Month和Day - 并返回一个日期。
使用SQL Server 2008,您需要做更多类似的事情 -
Declare @Year as int=2012
Declare @Month as int=12
Declare @Day as int=31
Select Convert(Date,Convert(varchar(4), @Year)
+
Convert(varchar(2), @Month)
+
Convert(varchar(2), @Day))
您可以使用SUBSTRING分割输入,例如
DECLARE @Year nvarchar(4) ='20' + SUBSTRING(InputField,1,2)
等。结合这两种技术,您就可以找到有效的解决方案。
(顺便说一下 - 请不要以现有列的格式存储日期,这样会对未来产生混淆。使用正确的数据类型会更好。)
答案 2 :(得分:0)
这更简单:
select convert(nvarchar(50), convert(date, RIGHT('102915',2) + LEFT('102915',4), 112), 110)
和分别:
create view v1 as
Select
convert(nvarchar(50), convert(date, RIGHT([ISSUE],2) + LEFT([ISSUE],4), 112), 110) as ISSUE,
convert(nvarchar(50), convert(date, RIGHT([EXPIRE],2) + LEFT([EXPIRE],4), 112), 110) as EXPIRE
from tablename
答案 3 :(得分:-1)
你应该用这个:
CONVERT(date, YOUR_DATE_FIELD, 1) AS DATE
有时,您无法像上面那样轻松转换,您需要使用LEFT,SUBSTR和RIGHT等功能。
这样的事情:
SELECT CONVERT(DATE, LEFT(field, 2) + SUBSTR(field, 2, 2) + RIGHT(field, 2), 1) AS DATE
来源:https://msdn.microsoft.com/es-es/library/ms187928%28v=sql.120%29.aspx