【问题标题】:Scripting the latest month in the data set [closed]编写数据集中最近一个月的脚本[关闭]
【发布时间】:2015-11-07 20:50:53
【问题描述】:

在下面的视图中,我不想在 where 条件中指定实际日期,而是希望 sql server 将 6 月和 5 月识别为最近一个月和(最近一个月-1),因为视图每月刷新一次,并且最近一个月和(最近一个月-1)也是如此。

PS:- 表格中最新报告月份为六月

SELECT (A.[First Name])
    ,A.[Last Name]
    ,A.[Report Month]
FROM (
    (
        SELECT DISTINCT [First Name]
            ,[Last Name]
            ,[Report Month]
            ,[Bill To Code]
            ,[Region]
            ,[Area]


        FROM dbo.Data
        WHERE (
                [Report Month] BETWEEN '2015-06-01'
                    AND '2015-06-30'
                AND [FTE Status] = 'Inactive'
                )
        ) A INNER JOIN (
        SELECT DISTINCT [First Name]
            ,[Last Name]
            ,[Report Month]
            ,[Bill To Code]
            ,[Region]
            ,[Area]


        FROM dbo.Data
        WHERE (
                [Report Month] BETWEEN '2015-05-01'
                    AND '2015-05-31'
                AND [FTE Status] = 'Active'
                )
        ) B ON A.[First Name] = B.[First Name]
        AND A.[Last Name] = B.[Last Name]
    )

谢谢,刚刚学会了如何在 SO 中更好地格式化。感谢 Sean。从我的错误中吸取教训..:)

【问题讨论】:

  • 您对哪些部分有问题?你真的没有问题。
  • Report_month 是您表中的一列吗?它不包含月份而是日期?而且数据不是最新的?那么最后一个月可能还没有出现在表格中?但是您仍然想从该表中获取上个月的数据吗?抱歉,这太混乱了,无法理解。
  • 对不起各位混淆了,报告月份是我表中的一列。它是一个日期字段,是的,表中的最新数据是2015年6月。将来当表更新时,值可能不是最近的,因此我必须让 sql server 读取最近一个月
  • 最后一个查询与此有什么关系?您必须意识到我们看不到您的屏幕,而我们唯一知道您想要做什么的就是您发布的内容......在这一点上并不多。帮助我们了解您想要做什么,因为我猜一旦我们了解它就很容易了。
  • select * from dbo.Data where ([Report Month] between '2015-05-01' and '2015-05-31' and [FTE Status]='Active')

标签: sql sql-server function date aggregate-functions


【解决方案1】:

因此我应该编写一些函数以便 sql server 读取开始 和数据集中最近一个月的结束日期。

您说您需要读取开始日期和结束日期,但如果您真正需要的只是获取表中最近一个月的所有数据,则可以这样做:

select *
from dbo.Data
where DATEDIFF(month,[Report Month],(SELECT MAX([Report Month] FROM dbo.Data))=0
and [FTE Status]='Active'

【讨论】:

  • 谢谢Tab,这就是我要找的东西
  • 你的逻辑就像一个魅力@Tab..非常感谢!
  • 很高兴它有帮助。您可以通过单击答案左侧的复选标记将此问题标记为已回答。 :)
【解决方案2】:

怎么样:

SELECT MAX(MONTH(Report_Month))
FROM YourTable
GROUP BY YEAR(Report_Month)
HAVING YEAR(Report_Month) = MAX(YEAR(Report_Month))

【讨论】:

  • 这是您从请求中读到的内容? OP 想要列出某年最后一个月的所有月份吗?好吧,鉴于我根本不理解这个请求,你甚至可能是对的,但我有疑问:-)
  • @ThorstenKettner 我想我所有的困惑。我已经更正了我认为*可能是解决方案的答案。
【解决方案3】:

尽管您的问题相当模糊,但我认为这就是您要寻找的。

这将返回 YourTable 中最大日期的第一天和最后一天。

;with cte as (
  select convert(date,left(convert(varchar,Max(Report_Month),112),6) + '01') startDate,
         month(Max(Report_Month)) n
  from YourTable
  union all
  select dateadd(month,n,convert(date,convert(varchar,year(startDate)) + '0101')) startDate,
        (n+1) n
  from cte
  where n < month(startDate) 
)
select startdate, dateadd(day,-1,dateadd(month,1,startdate)) enddate
from cte

【讨论】:

    猜你喜欢
    • 2022-08-18
    • 1970-01-01
    • 2011-08-27
    • 2011-03-03
    • 1970-01-01
    • 2014-09-17
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    相关资源
    最近更新 更多