比较日期字符串格式为' 6012017'迄今格式' 06-01-2017'

时间:2018-01-26 18:37:47

标签: sql sql-server

我有两个表都有一个日期列。一个存储为nvarchar,其格式为' 6012017'。另一个存储为日期,显示为' 06-01-2017'。

我需要能够通过匹配日期来链接表格。我已经尝试过将nvarchar转换为日期,但这并不起作用。

提前致谢!

3 个答案:

答案 0 :(得分:4)

这应该将您的日期列转换为领先' 0':

的日期
CONVERT(DATE, STUFF(STUFF(RIGHT('0' + [DateColumn], 8), 5, 0, '-'), 3, 0, '-'))

如果经常这样做,您可以考虑将其设置为持久计算列或标量函数。

如下面的评论中所述,如果您需要考虑" mm-dd-yyyy"或者" dd-mm-yyyy",您可以使用第三个参数来告诉CONVERT如何解释。对于你的例子有" mddyyyy"作为原始输入,这将需要风格" 110"所以它匹配字符串" mm-dd-yyyy"。

CONVERT(DATE, STUFF(STUFF(RIGHT('0' + [DateColumn], 8), 5, 0, '-'), 3, 0, '-'), 110)

更多款式:https://docs.microsoft.com/en-us/sql/t-sql/functions/cast-and-convert-transact-sql

答案 1 :(得分:0)

首先,您可以使用下面的方法将字符串格式化的日期时间格式化为有效的DateTime

DECLARE @i NVARCHAR(MAX) = '6012017'
set @i =  right(REPLICATE('0',8)+@i,8)

declare @date datetime
Set @date = (select DATEFROMPARTS(SUBSTRING(@i,5,4),SUBSTRING(@i,3,2),SUBSTRING(@i,1,2)))

Select @date

现在,@date中的内容是有效的DateTime值,您可以将其用于比较目的

注意:您可以在一个SELECT查询中编写整个查询,如下所示。 SELECT返回的内容是有效的DateTime

SELECT DATEFROMPARTS(
            SUBSTRING(RIGHT(REPLICATE('0',8)+'6012017',8),5,4),
            SUBSTRING(RIGHT(REPLICATE('0',8)+'6012017',8),3,2),
            SUBSTRING(RIGHT(REPLICATE('0',8)+'6012017',8),1,2))

即使对于06-01-2017,您也可以采用与以下相同的方法:

Select DATEFROMPARTS(
            SUBSTRING(REPLACE('06-01-2017','-','') ,5,4),
            SUBSTRING(REPLACE('06-01-2017','-','') ,3,2),
            SUBSTRING(REPLACE('06-01-2017','-','') ,1,2))

最后,如果您执行以下查询,您会注意到两个日期相等且比较过程已成功完成!

Select DateDiff(Day,
                DATEFROMPARTS(
                    SUBSTRING(RIGHT(REPLICATE('0',8)+'6012017',8),5,4),
                    SUBSTRING(RIGHT(REPLICATE('0',8)+'6012017',8),3,2),
                    SUBSTRING(RIGHT(REPLICATE('0',8)+'6012017',8),1,2)), 
                DATEFROMPARTS(
                    SUBSTRING(REPLACE('06-01-2017','-','') ,5,4),
                    SUBSTRING(REPLACE('06-01-2017','-','') ,3,2),
                    SUBSTRING(REPLACE('06-01-2017','-','') ,1,2)))

答案 2 :(得分:0)

我认为这是最简单的。它更短,嵌套更少,它使用的功能不需要记住任何奇怪的参数,它消除了对日期格式和分隔符的担忧。

select cast(right(dt, 4) + left(right('0' + dt, 8), 4) as date);
  

使用ISO 8601格式的优势在于它是一种   具有明确规范的国际标准。还有,这个   格式不受SET DATEFORMAT或SET LANGUAGE设置的影响。

https://docs.microsoft.com/en-us/sql/t-sql/data-types/datetime-transact-sql

在某些情况下仅使用确定性函数存在限制,但我不确定这是否会绕过该限制。