【问题标题】:SQL 2008 R2 GROUP BY YEAR / MONTH ErrorSQL 2008 R2 GROUP BY YEAR / MONTH 错误
【发布时间】:2016-04-16 17:14:16
【问题描述】:

我正在使用 SQL R2 2008。我正在尝试根据 YEAR、年份中的月份选择日期。我正在尝试在 nvarchar 中按年份分组。

我在 SQL 中的记录具有这样存储的日期格式 (dd/mm/yyyy hh:mm)

2015 年 10 月 11 日 10:01

借助 Stack 中的上一个问题 - How to Group by Year 我尝试了以下方法:

SELECT
  T.[Date]
FROM (SELECT
  CONVERT(varchar, CAST([U_DATE_TIME_VALUE] AS datetime), 3) AS [Date],
  ROW_NUMBER() OVER (PARTITION BY YEAR(CAST([U_DATE_TIME_VALUE] AS datetime)) ORDER BY (SELECT
    1)
  ) AS rn
FROM [FuelData]) AS T
WHERE T.rn = 1
ORDER BY T.[Date]

但我得到了下一年。

将 nvarchar 数据类型转换为 datetime 数据类型 导致超出范围的值。

  1. 我该如何解决这个问题?
  2. 如果我想从记录中单独选择年份和月份怎么办。 (即记录中仅 11/2015)。

有人可以帮助我吗?提前谢谢你。

【问题讨论】:

  • 贴一些数据来了解更多。
  • @Ajay2707 我已经添加了数据库记录,请检查一下。
  • 您也可以添加输出,以了解您的错误。抱歉迟到的评论
  • 将 nvarchar 数据类型转换为 datetime 数据类型导致值超出范围。 - @Ajay2707
  • 这是我得到的输出@Ajay2707

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


【解决方案1】:

这应该可以解决问题:

select convert(datetime, '10/11/2014 13:44', 103)

因此,您的代码将如下所示:

SELECT
  T.[Date]
FROM (SELECT
  CONVERT(datetime, [U_DATE_TIME_VALUE], 103) AS [Date],
  ROW_NUMBER() OVER (PARTITION BY YEAR(CONVERT(datetime, [U_DATE_TIME_VALUE], 103))
        ORDER BY (SELECT 1)
    ) AS rn
    FROM [FuelData]
) AS T
WHERE T.rn = 1
ORDER BY T.[Date]

【讨论】:

  • 但它只提供一条记录..?
  • 第一个代码示例可用于测试。第二个是您可能需要的。
  • 我说的是第二个。当我运行 sql 时,我只得到一个记录作为输出。!
  • 您说,您正在尝试按年份分组。如果您的所有数据都来自 2015 年,那么按年份分组会给您一行
  • 但我认为这是一种错误的做法。请参阅下面的答案。
【解决方案2】:

我不确定您是否找到了最好的帖子作为您要实现的目标的示例。

  1. 如果我想从记录中单独选择年份和月份怎么办。 (IE。 仅记录于 11/2015)。

如果确实在

dd/mm/yyyy hh:mm

格式,你可以使用SUBSTRING来选择这个字符串的一部分。

SELECT SUBSTRING(U_DATE_TIME_VALUE,4,7) FROM [FuelData] 应该可以解决问题。

SELECT SUBSTRING(U_DATE_TIME_VALUE,7,4) FROM [FuelData] 如果你只想要年份。

至于您最初的问题,请尝试这样的年度分组

SELECT 
  COUNT(*) AS [Units per year], 
  SUBSTRING(U_DATE_TIME_VALUE,7,4) AS [Year], 
  SUM(CAST(U_UNIT_AMT AS FLOAT)) AS [Amt per year]
FROM [FuelData]
GROUP BY SUBSTRING(U_DATE_TIME_VALUE,7,4)
ORDER BY SUBSTRING(U_DATE_TIME_VALUE,7,4)

或者,如果您希望它按月/年分组和排序,那么

SELECT 
  COUNT(*) AS [Units per month], 
  SUBSTRING(U_DATE_TIME_VALUE,4,7) AS [Month], 
  SUM(CAST(U_UNIT_AMT AS FLOAT)) AS [Amt per month]
FROM [FuelData]
GROUP BY SUBSTRING(U_DATE_TIME_VALUE,4,7)
ORDER BY SUBSTRING(SUBSTRING(U_DATE_TIME_VALUE,4,7),4,4), SUBSTRING(U_DATE_TIME_VALUE,4,7)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-14
    • 2018-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多