将Varchar转换为日期和日期比较

时间:2018-11-14 11:11:20

标签: sql sql-server sql-server-2012

我要转换两个日期列以找到最新的列

SELECT ISNULL(CONVERT(varchar(10),REPLACE('10-07-2015','/','-'), 103),'01-01-1900'),
ISNULL(CONVERT(varchar(10),REPLACE('10/7/2015','/','-'), 103),'01-01-1900'),
     CASE 
        WHEN ISNULL(CONVERT(varchar,REPLACE('10-07-2015','/','-'), 103),'01-01-1900') = ISNULL(CONVERT(varchar,REPLACE('10/7/2015','/','-'), 103),'01-01-1900')
          THEN '10-07-2015'
    END

我的问题是,某些日期缺少以“天”或“月”开头的零,并且比较得出错误的结果。有没有更好的方法来解决这个问题?另一个问题是,一列的日期带有'/',而另一列的日期带有'-'

当前情况仅是检查'=',但会添加更多内容以获取最新

1 个答案:

答案 0 :(得分:3)

您可以将这2个varchar转换为DATE类型,然后进行比较。

您可以找到日期/日期时间样式here

对于那些DD / MM / YYYY日期戳,103样式将适用。

要计算它们之间的最新值,只需将其包装在CASE中即可。

示例代码段

declare @T table (
  id int identity(1,1) primary key, 
  datestamp1 varchar(10), 
  datestamp2 varchar(10)
);

insert into @T (datestamp1, datestamp2) values 
 ('5/9/2018','17/9/2018')
,('9-10-2018','16-10-2018')
,('15-10-2018','13-10-2018')
;

SELECT *,
TRY_CONVERT(DATE, datestamp1, 103) as date1, 
TRY_CONVERT(DATE, datestamp2, 103) as date2,
CASE 
WHEN TRY_CONVERT(DATE, datestamp1, 103) >= TRY_CONVERT(DATE, datestamp2, 103) THEN datestamp1
WHEN TRY_CONVERT(DATE, datestamp2, 103) IS NULL THEN datestamp1
ELSE datestamp2
END AS MostRecentDatestamp
FROM @T;

返回:

id  datestamp1  datestamp2  date1       date2       MostRecentDatestamp
1   5/9/2018    17/9/2018   2018-09-05  2018-09-17  17/9/2018
2   9-10-2018   16-10-2018  2018-10-09  2018-10-16  16-10-2018
3   15-10-2018  13-10-2018  2018-10-15  2018-10-13  15-10-2018