删除最后一个空格前的字符,将结果从NVARCHAR转换为DATE

时间:2016-06-28 19:06:28

标签: sql-server tsql date nvarchar

我每月收到一份Excel电子表格,其中包含同一单元格中包含注释和日期的单元格。我将电子表格导入SQL表,需要提取最后8-10个字符(日期)并将它们从NVARCHAR转换为DATE格式。

示例:
    来自: 有效/无地址4/11/2016
    对此: 2016/04/11

我遇到的最大挑战是代表月份和日期的数字不是固定长度,它们可以是一个或两个字符。单个字符天或月没有前导零。

我已经尝试过CHARINDEX,RIGHT(),LEFT(),REPLACE和SUBSTRING的每个组合,我可以想到没有任何成功。

非常感谢对此的协助。

2 个答案:

答案 0 :(得分:1)

我将使用的方法是反转字符串,找到第一个空格,然后格式化该文本块。此代码适用于具有单值月份和日期的多个案例,并且不会受到日期之前文本长度的影响。

Declare @1 VARCHAR(50) = 'Active/No Address 4/11/2016'
Declare @2 VARCHAR(50) = 'Active/No Address 9/3/2016'
Declare @3 VARCHAR(50) = 'Active/No Address 12/31/2016'

SELECT 


 REPLACE(CONVERT(DATE, RIGHT(@1,CHARINDEX(' ',REVERSE(@1),0)), 110), '-','/')
, REPLACE(CONVERT(DATE, RIGHT(@2,CHARINDEX(' ',REVERSE(@2),0)), 110), '-','/')
, REPLACE(CONVERT(DATE, RIGHT(@3,CHARINDEX(' ',REVERSE(@3),0)), 110), '-','/')  

答案 1 :(得分:0)

喜欢这个吗?

declare @text nvarchar(max) = 'Active/No Address 4/11/2016';
declare @index int = charindex(' ', reverse(@text)) - 2;
declare @foo nvarchar(max) = substring(@text, len(@text) - @index, @index + 1);
select convert(datetime, @foo, 101)