我有两个表都有一个日期列。一个存储为nvarchar,其格式为' 6012017'。另一个存储为日期,显示为' 06-01-2017'。
我需要能够通过匹配日期来链接表格。我已经尝试过将nvarchar转换为日期,但这并不起作用。
提前致谢!
答案 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
在某些情况下仅使用确定性函数存在限制,但我不确定这是否会绕过该限制。