【问题标题】:SQL Server: get current month and previous monthsSQL Server:获取当前月份和前几个月
【发布时间】:2014-04-01 09:19:26
【问题描述】:

我有一个表格,其中有一列 dateE,其格式为 nvarchar(20),并包含格式为 yyyy-mm-dd 的日期。 以下存储过程从 2014 年 4 月的 dateE 获取该表中的所有记录:

BEGIN
    SET NOCOUNT ON;
    SELECT      cat,
                COUNT(*) AS groupCount
    FROM        Log_PE 
    WHERE       dateE LIKE '2014-04%'
    GROUP BY    cat
    ORDER BY    groupCount desc, cat
END

我怎样才能改变它,这样我就不必对日期进行硬编码,而是始终使用当前的年份和月份?

此外,我想使用相同的存储过程来获取前三个月(在本例中为 2014 年 1 月、2 月、3 月)的相同数据,以便最终获得与示例中一样的排名但对于上述每个月。

这里有人可以帮我吗?

提前非常感谢蒂姆。

【问题讨论】:

  • 为什么要在 varchar 中保存日期?

标签: sql sql-server date stored-procedures group-by


【解决方案1】:

不是比较字符串,而是比较日期。试试这个:

SELECT      cat, COUNT(*) AS groupCount
FROM        Log_PE 
WHERE       CONVERT(DATE, dateE, 120) >= 
              CONVERT(DATE, CONVERT(VARCHAR(6), GETDATE(), 112) + '01', 112)

GROUP BY    cat
ORDER BY    groupCount desc, cat

解释:

--Convert your string date column to a date type (yyyy-mm-dd --> 120)
CONVERT(DATE, dateE, 120)

--Convert the current date to yyyymmdd format (style 112) 
--and get the first 6 characters. ie; Year and month
CONVERT(VARCHAR(6), GETDATE(), 112) 

--Add `'01'` to the `yyyymm` and convert back to a date type
CONVERT(DATE, CONVERT(VARCHAR(6), GETDATE(), 112) + '01', 112) 

【讨论】:

  • 非常感谢。你能解释一下 Where 行吗?
  • 如果我现在和前三个月(分别)需要相同的内容,我可以在一个存储过程中实现吗?
  • 你的谓词不是 sargable。
  • 如果您需要前 3 个月,请将 GETDATE() 替换为 DATEADD(month, -3, GETDATE())
  • 好的,有几种方法可以做到这一点。您可以将另一个参数传递给 sp 说 (@AddMonths int) 并传递 0 代表当前,-1 代表以前,-2 代表 2 个月前等等,然后将 GETDATE() 替换为 DATEADD(month, @AddMonths, GETDATE())
【解决方案2】:

试试这个日期表达式:

...where dateE LIKE convert(varchar (7), GETDATE(), 20) + '%'

【讨论】:

  • 谢谢。在这种情况下,以下是我正在寻找的更多内容。
  • 更好的答案。你的谓词是sargabe。但是你可以简化你喜欢的表达方式。 convert(varchar(7), GETDATE(), 20)
  • 日期应该作为日期而不是字符串进行比较。不是一个好习惯。
  • @Kaf 首先,日期必须保持为日期。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多