从Varchar Datetime列中查找不同的日期

时间:2017-05-15 12:31:21

标签: sql sql-server sql-server-2008 date datetime

我在数据库中有一个类型为varchar的列,并将datetime值存储在:

15-05-2017 16:36:49
14-05-2017 19:27:41

等等

格式为dd-mm-yyyy hh:mm:ss

从MSSQL查询中,我想从此列中获取所有唯一日期。我已尝试按照stackoverflow本身的一个artiles上的建议使用DATE_FORMAT,但它没有用。

bs.com.CommandText = "SELECT DISTINCT(DATE_FORMAT(dat, '%d-%m-%Y') AS dat) FROM table";

我希望输出是从上面提到的列中获取的唯一日期列表(没有时间)。

我正在使用:MSSQL 2008 Express Edition和Visual Studio 2010 Express Edition。

请注意我使用的是内联查询,而不是存储过程。

3 个答案:

答案 0 :(得分:2)

只需转发date

SELECT DISTINCT CAST(date as DATE)
FROM table;

强制转换会在计数之前删除时间组件。无需将值转换为字符串。

编辑:

不要将日期/时间值存储为字符串!使用正确的数据类型。但是,因为你是,你可以这样做:

SELECT DISTINCT LEFT(date, 10)
FROM table;

答案 1 :(得分:0)

;With cte([Datetime])
As
(
SELECT '15-05-2017 16:36:49'Union all --Sample date
SELECT '14-05-2017 19:27:41'Union all
SELECT '15-05-2017 16:36:49'Union all
SELECT '12-05-2017 19:27:41'Union all
SELECT '15-05-2017 16:36:49'Union all
SELECT '16-05-2017 19:27:41'Union all
SELECT '15-05-2017 16:36:49'Union all
SELECT '19-05-2017 19:27:41'Union all
SELECT '15-05-2017 16:36:49'Union all
SELECT '14-05-2017 19:27:41'
)
Select ROW_NUMBER()Over(Order by (Select 1)) As Seq, [Datetime] From
(
select [Datetime],ROW_NUMBER()Over(Partition by [Datetime] order by [Datetime]) seq from cte
)dt
where dt.seq=1

Output of Distinct datecolumn

Seq Datetime
-----------------------
1   12-05-2017 19:27:41
2   14-05-2017 19:27:41
3   15-05-2017 16:36:49
4   16-05-2017 19:27:41
5   19-05-2017 19:27:41

答案 2 :(得分:0)

我的解决方案与Gordon相同,但我添加了dateformat,以防您的服务器具有不同的dateformat样式。

Declare @a table (date1 varchar(100))

Insert @a
select '15-04-2017 16:36:49'
union
select '14-04-2017 19:27:41'
union
select '15-05-2017 19:20:41'

set dateformat dmy;
select distinct convert(date,date1,105) from @a