从Varchar中提取日期

时间:2018-08-02 09:12:00

标签: sql sql-server

我在其中一列中具有以下数据。 SEMANA 50-15 (13-12-15) 数据类型:Varchar

我想在Microsoft-SQL中将上述数据转换为这种格式2015-12-13。 请帮我语法。

4 个答案:

答案 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)