【问题标题】:what is the to-char equivalent tsql/sql server 2008什么是 to-char 等效 tsql/sql server 2008
【发布时间】:2010-08-16 23:41:52
【问题描述】:

我习惯了oracle,现在被扔了T-SQL,我正在做一个课程,但在那之前你能帮上忙吗。

我有一个需要在几分钟内分组的列表。

行日期数据示例

SELECT ROWDATE,count(rowdate)
FROM [mydb].[dbo].[mytable]
GROUP BY ROWDATE
order by 1

2010-08-16 15:01:18.110 1
2010-08-16 15:01:18.203 1
2010-08-16 15:01:18.377 1
2010-08-16 15:01:18.453 1
2010-08-16 15:01:18.530 1
2010-08-16 15:01:18.610 1
2010-08-16 15:01:18.703 1
2010-08-16 15:01:18.813 1
2010-08-16 15:01:18.953 1
2010-08-16 15:01:19.173 1
2010-08-16 15:01:19.360 1
2010-08-16 15:01:19.483 1
2010-08-16 15:01:19.593 1
2010-08-16 15:01:19.673 1
2010-08-16 15:01:19.733 1
2010-08-16 15:01:19.813 1
2010-08-16 15:01:19.890 1
2010-08-16 15:01:19.970 1
2010-08-16 15:01:20.047 1

我只想按分钟分组。

SELECT to_char(rowdate,'dd/MM/yyyy HH24:MI'),count(rowdate)
FROM mytable
GROUP BY to_char(rowdate,'dd/MM/yyyy HH24:MI')
order by 1

在 sql server(T-SQL) 上,等效的脚本是什么?

【问题讨论】:

    标签: sql oracle tsql sql-server-2008


    【解决方案1】:

    TSQL 等价于:

    TO_CHAR(rowdate,'dd/MM/yyyy HH24:MI')
    

    ...是:

    CONVERT(VARCHAR(16), rowdate, 20)
    

    表达式“20”返回:yyyy-mm-dd hh:mi:ss(24h) - 这是 VARCHAR(19),因此将其缩减为 VARCHAR(16) 会省略秒数。

    DATETIME 格式化在 TSQL 中是一个真正的难题 - 在 SQL Server 2005 中,获得可自定义格式化的唯一真正方法是使用 CLR 函数,因此在 C# 中您可以使用 DateTime.ToString 方法...

    参考:

    【讨论】:

      【解决方案2】:

      应该是

      convert(varchar, rowdate, 100)
      

      格式不完全一样,但重要的是,它也是一分钟。


      编辑:

      或者,您可以完全避免转换为 varchar:

      group by dateadd(ms, -datepart(ms, rowdate) , dateadd(s, -datepart(s, rowdate), rowdate))
      

      【讨论】:

      • 在 h12:mi 中给出时间,而不是 h24:mi
      • 正确。我认为它并不完全相关,因为您仍然可以按它分组,这是我能想到的最简单的事情。显然,还有其他解决方案。
      • 不定义 VARCHAR 长度也是有风险的——通常,如果定义了长度,SQL Server 只会分配一个字符。但是当我在 SQL Server 2005 上测试时,这不是问题
      • 不,varchar 的默认长度是30
      • DECLARE @test VARCHAR SET @test = 'abc' SELECT @test - 你只会得到“a”
      【解决方案3】:

      将日期时间降低到分钟使用(这比使用字符串操作更好):

      DATEADD(minute,DATEDIFF(minute,0,datetime),0)
      

      所以,按分钟分组,应该是:

      SELECT 
          DATEADD(minute,DATEDIFF(minute,0,ROWDATE),0)
          ,count(rowdate)
      FROM [mydb].[dbo].[mytable]
      GROUP BY DATEADD(minute,DATEDIFF(minute,0,ROWDATE),0)
      order by 1
      

      【讨论】:

      • 你忘记了毫秒部分。
      • @GSerg,我不确定你在说什么?我将日期时间降到分钟的方式是普遍接受的禁食方法,请参阅:Floor a date in SQL server
      【解决方案4】:

      您是否有特定原因需要转换为 (var)char?

      datepart(minute, rowdate)
      

      这仅返回一个数字:日期时间字段的分钟部分。很容易分组。

      否则使用 CONVERT() 或 CAST() 在字符类型之间进行转换。您还需要确保使用正确的格式。这里还有更多内容:http://www.mssqltips.com/tip.asp?tip=1145

      【讨论】:

      • 这将在不同时间将同一分钟组合在一起,这不是我认为的 OP 想要的。我认为CONVERT(VARCHAR(20), GETDATE(), 100) 可能会这样做。
      • @Martin Smith:差不多,但是“100”在 h12:mi 中给出时间,而不是 h24:mi
      • @OMG - 但作为一个分组因素,它应该仍然工作相同(它返回 Aug 16 2010 4:39PM 所以不会将 AM 和 PM 组合在一起)
      • Martin,也许,这只是一个建议。我不知道为什么我的答案如此糟糕,应该得到-1 tho。
      猜你喜欢
      • 1970-01-01
      • 2011-06-26
      • 2011-01-10
      • 1970-01-01
      • 2010-11-19
      • 1970-01-01
      • 1970-01-01
      • 2016-03-28
      • 2020-03-02
      相关资源
      最近更新 更多