如何重新格式化和排序存储在 nvarchar 中的日期
Posted
技术标签:
【中文标题】如何重新格式化和排序存储在 nvarchar 中的日期【英文标题】:How to reformat and sort dates stored in nvarchar 【发布时间】:2009-07-15 17:36:47 【问题描述】:我正在尝试显示日期列的月份和 YY 部分,使其应显示为
原始格式
Apr 12 2009;
Feb 20 2009;
Dec 24 2008;
May 18 2009;
Jan 8 2009;
Dec 6 2008;
Apr 19 2009;
Jan 4 2009;
May 13 2009;
Jan 5 2009
从这些日期开始,应该删除日期部分,使其显示为“Apr 09”,并且仍然可以按日期排序,使其显示为:
Dec 08;
Jan 09;
Feb 09;
Mar 09;
Apr 09;
May 09
谢谢, 下垂。
【问题讨论】:
列数据类型是否为“日期”(SQL 2008)并且您以美国格式或输入格式显示数据?还是存储为 varchar? @gbn,OP 将它们存储在 nvarchar "mon d yyyy" 啊,是的,“日期”与“2009 年 4 月 23 日”的出现方式不同。抱歉,来晚了…… 【参考方案1】:如果要将日期作为字符串存储在数据库中,则需要使用与 ISO-8601 标准相同原则的格式,即使用数字月份并将最重要的值放在首位。
要在文本上可排序,您的值需要如下所示:
08-12, 09-01, 09-02, 09-03, 09-04, 09-05
但是,我建议您将日期作为日期时间值存储在数据库中,并在显示值时注意格式。这样您就可以轻松地在数据库中对它们进行排序(还可以进行任何其他处理,例如获取两个日期之间的差异)。
从日期时间值可以很容易地得到你想要的格式。例如,在 .NET 中,您可以使用 theDate.ToString("MMM yy")
来完全按照您的意愿格式化日期。当您在从数据库中获取数据后进行格式化时,格式不是文本可排序的,这不是问题。
【讨论】:
我使用的 SQL Server 数据库与大型机数据库进行了相当多的交互,并且日期总是以 YYYYMMDD 格式的字符串来回传递(它可以接受的唯一日期格式)。这实际上适用于排序,并且很容易在其他日期格式之间来回转换。 @BBlake:是的,该格式遵循首先具有最重要的值并使用固定大小值的原则,因此它们是可排序的。但是,如果不解析它们,您将无法对它们做更多的事情。【参考方案2】:你需要LEFT函数,你可以在SQL SERVER中对datetime或者smalldatetime进行排序。
【讨论】:
【参考方案3】:你没有说哪个数据库,这是用于 SQL Server 的... 试试:
declare @x table (datestring nvarchar(30))
insert into @x values ('Feb 20 2009')
insert into @x values ('Dec 24 2008')
insert into @x values ('May 18 2009')
insert into @x values ('Jan 8 2009')
insert into @x values ('Dec 6 2008')
select * from @x
SELECT
LEFT(CONVERT(varchar(30),convert(datetime,datestring),109),3)+' '+SUBSTRING(CONVERT(varchar(30),convert(datetime,datestring),121),3,2)
FROM @x
ORDER BY CONVERT(datetime,datestring)
您不应该将日期存储在字符串中,这会占用更多空间,并且难以对它们进行排序和比较。
【讨论】:
以上是关于如何重新格式化和排序存储在 nvarchar 中的日期的主要内容,如果未能解决你的问题,请参考以下文章
如何按数字顺序对字母数字 SQL Server NVARCHAR 列进行排序?