如何重新格式化和排序存储在 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 中的日期的主要内容,如果未能解决你的问题,请参考以下文章

如何根据作为输入的列表正确排序 QTreeView 中的列

如何按数字顺序对字母数字 SQL Server NVARCHAR 列进行排序?

存储过程中的存储过程 NVARCHAR 输出值

如何使用 Nvarchar(max) 参数创建 CLR 存储过程?

如何在 dgrid 中使用 dnd 实现行重新排序

NVARCHAR 存储 SQL Server 上 UCS-2 编码不支持的字符