请帮助,这已经使我发疯了几个月了。
我正在从结构不太好且有很多挑战的MS SQL DB查询数据。迄今为止,让我感到困惑的一个特殊挑战是,以一种用户易于理解并被Excel识别为日期(而非文本)的格式来显示日期
首先,此数据库中的日期存储为'yyyymmdd'varchar(8)。我想转换为dd / mm / yyyy(英国格式)。我通过使用以下许多不同的功能实现了这一目标...
FORMAT(CAST(20180728 as date, 'dd/MM/yyyy')
CONVERT(date,20180728,120)
SUBSTRING(20180728,7,2) + '/' + SUBSTRING(20180728,5,2) + '/' + SUBSTRING(20180728,1,4)
所有这些都能提供理想的结果,但是当在Excel中查看时,它们被视为文本,因此按范围进行过滤将成为一个挑战。
然后我发现以下功能被Excel识别为日期,但不是用户友好的显示...
CONVERT(smalldatetime, 20180728, 103)
尽管在我访问过的所有网站上都读到了代码103应该以英国格式返回,但这仍返回格式为2018-07-28 00:00:00。
我很高兴地知道,一旦数据处于excel格式,就可以将其重新格式化,但是我正尝试避免这种情况,并直接将其输入到Excel中,而不会造成进一步的用户干扰。
希望得到一个很好的答案
答案 0 :(得分:0)
将excel列更改为日期格式。
答案 1 :(得分:0)
您可以进行两次转换。首先转换为(small)datetime
,就像我在评论中所说的,没有格式为 1 ,然后将其转换为所需的字符串格式:
select CONVERT(varchar(10),
CONVERT(smalldatetime,'20180728',112) --This string is yyyymmdd
,103) --I want a string as dd/mm/yyyy
但是,我怀疑,如果Excel对您的其他一些工作不满意,结果会有所不同。
1 内部的smalldatetime
类型由两个16位整数(范围为0-65535)组成。其中一个存储了自1900年1月1日以来经过的整天数。另一个存储了午夜后的分钟数。精明的人会注意到该计划浪费了5位,但这很简单。
认识到在处理格式化时,您几乎总是在看两种数据类型之间的 conversion ,其中这些数据类型之一是字符串。该字符串没有“具有”格式-它包含结果或据称与 match 格式相符的字符。而且其他数据类型通常也没有“具有”格式。转换过程本身需要格式。
还可以识别您不经常直接查看数据。如果您例如在SQL Server Management Studio中运行查询,您看不到数据,看到的数据是SSMS处理过的,它是处理任何非字符串数据必须采取的不可避免的步骤之一它要显示的是将其转换为字符串。而且它执行的转换不受您的控制,但重要的是,不要告诉您实际的数据是什么。