【问题标题】:T-SQL select distinct formatted datetime while still sorting as unformatted datetimeT-SQL 选择不同的格式化日期时间,同时仍排序为未格式化的日期时间
【发布时间】:2020-01-09 19:38:06
【问题描述】:

我在我正在处理的服务器上只有 SELECT 权限。我正在尝试编写一个查询,其中一列是格式化的日期时间:

--mydb.EventDate is column EventDate(datetime, not null)

SELECT DISTINCT
    FORMAT(mydb.EventDate, 'M/d/yyyy h:mm:ss tt') as 'EventDate',
    [Other Specified Columns]
FROM
    mytsqldb.myschema.mytable AS mydb
ORDER BY 
    EventDate, [Other Specific Columns]

我还需要按事件日期按时间顺序排序。但是,使用这种格式,它会按字母顺序排序(我认为)。由于 SELECT DISTINCT,我在 ORDER BY 时无法转换 EventDate。但是,我不希望将任何其他列添加到查询的输出中。日期时间的格式有点重要,但如果需要我可以放弃那个幽灵。我正在寻找的可能吗?

【问题讨论】:

  • "where one of the columns is a formatted datetime"SQL Server 中没有格式化的日期时间,除非您存储的是格式化的字符串。哪个不好

标签: sql-server tsql datetime format distinct


【解决方案1】:

GROUP BY代替DISTINCT

SELECT 
  FORMAT(mydb.EventDate, 'M/d/yyyy h:mm:ss tt') as 'EventDate',
  [Other Specified Columns]
FROM mytsqldb.myschema.mytable as mydb
GROUP BY mydb.EventDate, FORMAT(mydb.EventDate, 'M/d/yyyy h:mm:ss tt'), [Other Specified Columns]
ORDER BY mydb.EventDate, [Other Specific Columns]

或使用子查询:

SELECT FORMAT(t.EventDate, 'M/d/yyyy h:mm:ss tt') AS EventDate, [Other Specified Columns]
FROM (
  SELECT DISTINCT
    mydb.EventDate,
    [Other Specified Columns]
  FROM mytsqldb.myschema.mytable as mydb 
) AS t
ORDER BY t.evDate, [Other Specific Columns]

【讨论】:

  • 我使用的 select 语句大约有 3000 个字符长,我必须对 GROUP BY 和 SELECT 语句进行任何更改。有什么好的方法可以避免在查询中出现这种情况,还是我应该加强并处理它以保持我的格式?
  • 如果您的意思是 SELECT 列表中有很多列需​​要,那么是的,您必须在 GROUP BY 子句加上 EventDate 列中再次重复它们,因此这会进一步扩展 sql 语句。没有其他方法可以获取不同的行并在 ORDER BY 子句中使用 EventDate(或者至少我不知道)。
  • @BlairCliff 在我编辑的答案中尝试另一个带有子查询的选项(尽管我无法说出它的效率)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-15
  • 1970-01-01
  • 2021-10-14
  • 1970-01-01
  • 2011-11-20
  • 2018-06-15
相关资源
最近更新 更多