如何在SQL中将日期字符串(ddMMyy)格式化为日期字符串(yyMMdd)?

时间:2018-07-31 15:22:31

标签: sql sql-server

我有一列名为“ date”且类型为varchar的日期,日期格式为:“ ddMMyy”,但是要使用“ between”,我需要将日期更改为“ yyMMdd”格式。

我已经尝试了2个小时,但仍无法解决,谢谢您的帮助。

2 个答案:

答案 0 :(得分:3)

修复您的数据结构!您应该可以做到:

update t
    set datecol = convert(date, datecol, 104);  -- this format seems to work

alter table t alter column datecol date;

alter table t add datecol_ddmmyy as (replace(convert(varchar(8), datecol, 104), '.', '');

Voila!该列现在可以正确用作日期。并且您还有另一列将日期设置为字符串格式。

答案 1 :(得分:1)

如果您在日期部分之间使用分隔符,那么我认为Gordon Linoff的答案会很好。 (我知道您说过您不能更改表的结构,但是您至少可以使用他提供的将日期字符串转换为正确日期的表达式。)但是我对您的问题的理解是,您的日期实际上是六个字符没有分隔符的字符串(例如010199),当我尝试对此类数据使用date style 104时出现错误。不幸的是,这种格式似乎与该链接上给出的任何预定义样式都不匹配,因此我认为您可能不得不采用字符串操作来将日期重新排列为yyMMdd(ISO)格式并从那里转换。例如:

declare @Table table ([date] varchar(6));
insert @Table values ('010101'), ('010110'), ('010149'), ('010150'), ('010199');

select
    [date], 
    ConvertedDate = convert(date, 
        substring([date], 5, 2) + 
        substring([date], 3, 2) + 
        substring([date], 1, 2), 12) 
from 
    @Table;

在我的数据库上显示:

date    ConvertedDate
010101  2001-01-01
010110  2010-01-01
010149  2049-01-01
010150  1950-01-01
010199  1999-01-01

请注意,由于数据库使用两位数的年份,因此SQL Server使用隔离日期来确定是否应将年份解释为属于20世纪或21世纪。就我而言,您可以从上面的结果集推导出为2049。您可以查看this article,以获取有关查询和更改此设置的信息(尽管我认为更改此设置可能对您而言是不可能的)。

希望数据库设置与填充该数据库的任何软件所使用的逻辑相对应,但是如果没有,并且如果您无法使它们同步,则必须更新{{1} }上面显示的表达式可以手动计算世纪,并使用样式112而不是12来表示存在四位数的年份。可能是这样的:

ConvertedDate

这当然很混乱,但是我不确定有更好的方法。祝你好运。