如何将datetime的转换存储在具有新列名的新列中,可以在其上使用ORDER BY?

时间:2019-02-18 12:14:35

标签: sql sql-server

我有一个datetime列,我想从此列中删除重复的“ DATES”。

现有列的数据类型为datetimeoffset(7):

2018-06-17 00:44:13.0000000 +00:00

我现在可以像这样提取日期:

SELECT CONVERT(VARCHAR(10), mytimestamp_column, 102) FROM [dbo].[myTable] 
where mycondition = 1223445

这给了我这样的一列:

(No column name)
2018.06.18
2018.06.17
2018.06.16
.... and so on

现在我正试图给这个新列起一个名字,所以我可以在此列上使用“ ORDER BY”对结果进行排序。第一个问题,我该怎么做,我正在尝试以下操作并获得语法错误:

select newcolumn from(
(SELECT CONVERT(VARCHAR(10), mytimestamp_column, 102) FROM [dbo].[myTable] 
where mycondition = 1223445) as newcolumn
order by newcolumn desc

第二个问题:我如何以一种简单的方式从结果集中删除重复的日子,我试图避免使用冗长而复杂的表达式/公式?

tnx:)

5 个答案:

答案 0 :(得分:4)

只需按数量/列或别名直接排序:

SELECT
    CONVERT(VARCHAR(10), mytimestamp_column, 102) AS col
FROM [dbo].[myTable] 
WHERE mycondition = 1223445
ORDER BY
    col DESC;

您实际上不需要在这里进行子查询。

答案 1 :(得分:3)

在您的查询中newcolumn是一个表(子查询)别名而不是列别名,您必须以以下方式编写查询

select * from
 (
(SELECT CONVERT(VARCHAR(10), mytimestamp_column, 102) as col -- column alias
FROM [dbo].[myTable] 
where mycondition = 1223445
) as newcolumn --subquery name 
order by col desc

答案 2 :(得分:2)

您可以使用Row_Number进行尝试,如下所示。

DELETE A FROM(
    SELECT
      Row_Number() Over(Partition By mytimestamp_column Order By 
      mytimestamp_column) as RN, CONVERT(VARCHAR(10), mytimestamp_column, 102) as 
      NewColumn
      FROM [dbo].[myTable] 
      --where mycondition = 1223445) as newcolumn
     )A where RN > 1

您可以找到演示Here

答案 3 :(得分:1)

使用通用表表达式来创建类似于模式的表,并将其用于进一步查询。

 GO
 ;WITH CTE AS 
 (
  SELECT Row_Number() Over(Partition By mytimestamp_column Order By 
   mytimestamp_column) as Slno, CONVERT(VARCHAR(10), mytimestamp_column, 102) as newcolumn  
  FROM [dbo].[myTable] where mycondition = 1223445)
  Select * from cte where Slno>1 order by newcolumn desc
  GO

答案 4 :(得分:1)

只需将值转换为日期即可提取日期:

convert(date, mytimestamp_column)

如:

order by convert(date, mytimestamp_column)

要从结果集中中删除重复项,请使用窗口函数:

select newcolumn
from (select t.*,
             convert(date, mytimestamp_column) as mydate,
             row_number() over (partition by convert(date, mytimestamp_column) order by mytimestamp_column) as seqnum
      from t
      where mycondition = 1223445
     )
where seqnum = 1;

如果要永久删除表中的行,请仅使用delete