我在其中一列中具有以下数据。
SEMANA 50-15 (13-12-15)
数据类型:Varchar
我想在Microsoft-SQL中将上述数据转换为这种格式2015-12-13
。
请帮我语法。
答案 0 :(得分:1)
如果日期始终用括号括起来,并且只有一对括号并且格式为dd-mm-yy
(意大利语),那么以下内容可能会有所帮助。
它使用charindex()
定位括号的位置,并使用substring()
提取括号之间的子串。然后,该子字符串将转换为date
并转换回具有所需格式的varchar
。
SELECT convert(varchar,
convert(date,
substring(<column>,
charindex('(',
<column>)
+
1,
charindex(')',
<column>)
-
charindex('(',
<column>)
-
1),
5),
20)
FROM <table>;
用您的列名和表名替换<table>
和<column>
。
答案 1 :(得分:1)
删除所有测试直到第一个括号并替换第二个括号,将日期转换为dd / mm / yy转换为char(10)-这确实要求所有行在括号中都具有有效日期。< / p>
SELECT
convert(char(10),
convert(date,REPLACE(STUFF(col,1,charindex('(',col),''), ')', ''), 3), 126)
FROM (values('SEMANA 50-15 (13-12-15)'), ('TEST (18-1-18)')) x(col)
答案 2 :(得分:1)
如果日期始终在末尾且始终为“ DD-MM-YY”格式(即日期中有8个字符,并且日期在末尾前一个字符),则应这样做:< / p>
SELECT CONVERT(DATE, REPLACE(SUBSTRING(YourFieldName, LEN(YourFieldName)-8,8),'-','/'), 3)
FROM YourTableName
要进行分解,这是假设可以找到从结尾开始八个字符的日期开始(因此必须为DD-MM-YY格式),它使用SUBSTRING
命令提取日期。然后,它执行REPLACE
将'-'更改为'/',以使CONVERT
命令起作用并以您指定的格式返回日期。
请注意,以上代码返回了Date
,如果您特别需要返回VARCHAR
,则可以应用第二个CONVERT
,请参见https://www.w3schools.com/sql/func_sqlserver_convert.asp或{{3 }},以了解有关CONVERT
的不同选项的更多信息。
答案 3 :(得分:0)
您可以对以下内容进行简单的UPDATE
声明:
UPDATE <TABLE >
SET <COLUMN > = LEFT(<COLUMN >, PATINDEX('%(%', <COLUMN >)) -- left part of string
+ CAST(CONVERT(
DATE,
SUBSTRING(
<COLUMN >,
PATINDEX('%(%', <COLUMN >) + 1,
PATINDEX('%)%', <COLUMN >) - 1 - PATINDEX('%(%', <COLUMN >)
),
5
) AS VARCHAR(12))-- converted part of string
+ RIGHT(<COLUMN >, LEN(<COLUMN >) - PATINDEX('%)%', <COLUMN >) + 1) -- right part of string
在上面的脚本中,请用您的列名替换<COLUMN>
,并用您的表名替换<TABLE>
我从以下测试环境中得出了该语句:
DECLARE @vValue1 VARCHAR(30)
DECLARE @iStartVal INT
DECLARE @iEndVal INT
DECLARE @iStringLength INT
DECLARE @iSearchStringLenght INT
SET @vValue1 = 'SEMANA 50-15 (13-12-15)'
SET @iStartVal = PATINDEX('%(%', @vValue1)
SET @iEndVal = PATINDEX('%)%', @vValue1)
SET @iStringLength = @iEndVal -1 - @iStartVal
PRINT @vValue1
PRINT @iStartVal
PRINT @iEndVal
PRINT @iStringLength
PRINT CONVERT(
DATE,
SUBSTRING(
@vValue1,
PATINDEX('%(%', @vValue1) + 1,
PATINDEX('%)%', @vValue1) - 1 - PATINDEX('%(%', @vValue1)
),
5
)
PRINT LEFT(@vValue1, @iStartVal)
PRINT RIGHT(@vValue1, LEN(@vValue1) - @iEndVal + 1)
PRINT LEFT(@vValue1, PATINDEX('%(%', @vValue1)) -- left part of string
+ CAST(CONVERT(
DATE,
SUBSTRING(
@vValue1,
PATINDEX('%(%', @vValue1) + 1,
PATINDEX('%)%', @vValue1) - 1 - PATINDEX('%(%', @vValue1)
),
5
) AS VARCHAR(12)) -- converted part of string
+ RIGHT(@vValue1, LEN(@vValue1) - PATINDEX('%)%', @vValue1) + 1)