请问SQL如何把当前月份加1个月,同时把日改成1日

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了请问SQL如何把当前月份加1个月,同时把日改成1日相关的知识,希望对你有一定的参考价值。

例如:dateadd(month,1,getdate()) 只能在当前月加一个月,不能同时把日改成1日
这么多回答??? 各个都可以运行。。我该选哪个???

select DATEADD(MONTH,DATEDIFF(MONTH,0,@Date)+1,0) AS '下月第一天'

补充,日期处理

--定义给定的一天
DECLARE @Date DATETIME = GETDATE();

SELECT @Date AS '目前时间'
,DATEADD(DD,-1,@Date) AS '前一天'
,DATEADD(DD,1,@Date) AS '后一天'
/*月计算*/
,DATEADD(MONTH,DATEDIFF(MONTH,0,@Date),0) AS '月初'--在SQL Server中0 代表1900-01-01,通过月运算,保证日恒久为1号
,DATEADD(DD,-1,DATEADD(MONTH,1+DATEDIFF(MONTH,0,@Date),0)) AS '月末(精确到天)'--找到下月初再扣减1天,建议使用DATEADD而不要直接“-1”
,DATEADD(SS,-1,DATEADD(MONTH,1+DATEDIFF(MONTH,0,@Date),0)) AS '月末(精确到datetime的小数位)'
,DATEADD(MONTH,DATEDIFF(MONTH,0,@Date)-1,0) AS '上月第一天'
,DATEADD(DAY,-1,DATEADD(DAY,1-DATEPART(DAY,@Date),@Date)) AS '上月最后一天'
,DATEADD(MONTH,DATEDIFF(MONTH,0,@Date)+1,0) AS '下月第一天'
,DATEADD(DAY,-1,DATEADD(MONTH,2,DATEADD(DAY,1-DATEPART(DAY,@Date),@Date))) AS '下月最后一天'
/*周计算*/
,DATEADD(WEEKDAY,1-DATEPART(WEEKDAY,@Date),@Date) AS '本周第一天(周日)'--注意此处与@@datefirst的值有关
,DATEADD(WEEK,DATEDIFF(WEEK,-1,@Date),-1) AS '所在星期的星期日'--注意此处与@@datefirst的值有关
,DATEADD(DAY,2-DATEPART(WEEKDAY,@Date),@Date) AS '所在星期的第二天'--注意此处与@@datefirst的值有关,其他天数类推
,DATEADD(WEEK,-1,DATEADD(DAY,1-DATEPART(WEEKDAY,@Date),@Date)) AS '上个星期第一天(周日)'--注意此处与@@datefirst的值有关
,DATEADD(WEEK,1,DATEADD(DAY,1-DATEPART(WEEKDAY,@Date),@Date)) AS '下个星期第一天(星期日)'--注意此处与@@datefirst的值有关
,DATENAME(WEEKDAY,@Date) AS '本日是周几'
,DATEPART(WEEKDAY,@Date) AS '本日是周几'--返回值 1-星期日,2-星期一,3-星期二......7-星期六
/*年度计算*/
,DATEADD(YEAR,DATEDIFF(YEAR,0,@Date),0) AS '年初'
,DATEADD(YEAR,DATEDIFF(YEAR,-1,@Date),-1) AS '年末'
,DATEADD(YEAR,DATEDIFF(YEAR,-0,@Date)-1,0) AS '去年年初'
,DATEADD(YEAR,DATEDIFF(YEAR,-0,@Date),-1) AS '去年年末'
,DATEADD(YEAR,1+DATEDIFF(YEAR,0,@Date),0) AS '明年年初'
,DATEADD(YEAR,1+DATEDIFF(YEAR,-1,@Date),-1) AS '明年年末'
/*季度计算*/
,DATEADD(QUARTER,DATEDIFF(QUARTER,0,@Date),0) AS '本季季初'
,DATEADD(QUARTER,1+DATEDIFF(QUARTER,0,@Date),-1) AS '本季季末'
,DATEADD(QUARTER,DATEDIFF(QUARTER,0,@Date)-1,0) AS '上季季初'
,DATEADD(QUARTER,DATEDIFF(QUARTER,0,@Date),-1) AS '上季季末'
,DATEADD(QUARTER,1+DATEDIFF(QUARTER,0,@Date),0) AS '下季季初'
,DATEADD(QUARTER,2+DATEDIFF(QUARTER,0,@Date),-1) AS '下季季末'
参考技术A DECLARE @m datetime = getdate()

select stuff(CONVERT(varchar(20),dateadd(MONTH,1,@m),120),9,2,'01')

-----------------------------------------------------------------------------------------------
先把月份加1
转换成字符串
日变为01
---------------
目前是字符串格式 ,你可以再cast( as datetime ) 这样再转成日期格式
参考技术B 看看我这个,先获得本月第一天,然后再加1月:
dateadd(month,1,dateadd(day,-1*( day(getdate()) -1),getdate() )本回答被提问者采纳
参考技术C select convert(varchar, datepart(year,getdate()))+'-'+convert(varchar,datepart(month,dateadd(month,1,getdate()))) +'-'+'1' 参考技术D select convert(char(7),getdate(),120) +'-01'

合计当前月份 + 2 AND 下个月 + 1 和之后的月份

【中文标题】合计当前月份 + 2 AND 下个月 + 1 和之后的月份【英文标题】:Sum Current Month + 2 AND Next Month + 1 and Month After that 【发布时间】:2019-08-23 03:34:24 【问题描述】:

我需要在 DAX 中为 PowerBI 复制一个指标,但我不太确定如何去做。

基本是这样的:

事实表:机会

维度:创建日期、关闭日期

度量是这样的,我只是举个例子,因为我真的不知道如何解释它。

总和:

2 月创建,2 月、3 月、4 月关闭日期

创建于 3 月,截止日期为 3 月、4 月

在 APR 中创建并在 APR 中关闭

表/矩阵中的每个月都会发生这种情况。

似乎我需要一些变量,例如

测量 =

VAR Month1 = SUM(ClosedOpps) 其中 ClosedDate 在 CurrentMonth 和 CurrentMonth + 2 之间

VAR Month2 = SUM(CLosedOpps) 其中 ClosedDate 介于 CurrentMonth + 1 和 CurrentMonth + 2 之间

VAR Month3 = SUM(ClosedOpps) 其中 ClosedDate = CurrentMonth + 2

返回 Month1 + Month2 + Month3

我的理解是,当我将 MonthYear 列拖到视觉对象中时,关闭日期过滤器将是表/矩阵视觉对象

编辑:

这是他们在 Excel 中所做工作的简化副本

所以左边的数据是事实表。您可以查看 Opps 的创建时间和关闭时间。我添加了 Created MonthYear 和 Closed MonthYear。 Pivot 是他们现在在 Excel 中所拥有的。顶部(列)的日期是创建年月,行的日期是关闭年月。

我需要能够对 I3:K5 中的数字求和,在示例中总计为 5500。

更新:

所以我在建议的日期维度表中添加了它,复制了它(一个用于打开日期,一个用于关闭日期)我添加了一个列 DateDIM_KEY 到每个列,它只是一个数字索引。事实表有这些键,它们是从相同的日期范围(2013 年到 2030 年)加载的。事实表中的 ActualValue 列是我们要求和的列。

这是更新后的事实表示例。我直接从这些日期的日期维度中提取了 DateDIM_KEY 值。

【问题讨论】:

您能否提供一个数据样本,这样我们就不会猜测了? 查看更新后的屏幕截图 【参考方案1】:

您需要一个好的日期维度。你需要让它为 OpenDate 和 CloseDate 进行角色扮演。那里有很多不错的日期维度。我喜欢mine。

假设您将 'OpenDate'[Month] 放在轴标签上。

Opportunity Value = SUM ( 'Opportunity'[Value] )
MyMeasure iterator =
// start of the month on the current row of a pivot/axis label of a chart
VAR CurrentMonthStart = MIN ( 'OpenDate'[Date] )
// End of the month 2 months out
VAR ThreeMonthsOutEnd = EOMONTH ( CurrentMonthStart, 2 )
// This represents one row per month. You could also use a MonthAndYear type field.
// We will walk through the three open months we care about, and in each will sum
// the value for the opportunities opened in that month, with additional filters.
VAR NextThreeOpenMonths =
  CALCULATETABLE (
    VALUES ( 'OpenDate'[MonthIndex] ),
    ALL ( 'OpenDate' ),
    DATESBETWEEN ( 'OpenDate'[Date], CurrentMonthStart, ThreeMonthsOutEnd )
  )
RETURN
  // Iterate each OpenMonth
  SUMX (
    NextThreeOpenMonths,
    // On each step of the iteration, grab the start of the currently iterated month
    VAR IterMonthStart = CALCULATE ( MIN ( 'OpenDate'[Date] ) )
    RETURN
      CALCULATE (
        [Opportunity Value],
        // There is date context from visuals we want to ignore:
        ALLEXCEPT ( 'OpenDate', 'OpenDate'[MonthIndex] ),
        // filter CloseDate to be between the start of the currently iterated
        // open month and the originally calculated ThreeMonthsOutEnd. The latter
        // is static within the scope of the iteration.
        DATESBETWEEN ( 'CloseDate'[Date], IterMonthStart, ThreeMonthsOutEnd )
      )
  )

另外,在编写之前的迭代方法时,我意识到我们可以在单个 setfilter 中完成这项工作:

MyMeasure set =
// MonthIndex is in my date dimension - super useful for arithmetic on dates.
// Read the readme.
VAR C = SELECTEDVALUE ( 'OpenDate'[MonthIndex] ) // want a short name below
// Table literal syntax - two column table, where each parenthesized expression
// forms a row. If it were much more, I'd do something clever with generate, but
// six cases are easy to write by hand.
VAR MonthFilters = 
  (C, C),
  (C, C+1),
  (C, C+2),
  (C+1, C+1),
  (C+1, C+2),
  (C+2, C+2)

RETURN
  CALCULATE (
    [Opportunity Value],
    TREATAS ( MonthFilters, 'OpenDate'[MonthIndex], 'CloseDate'[MonthIndex] )
  )

我更喜欢后者,但直到编写了迭代版本后才想到它,所以我要离开两者。基于集合的性能应该更好。

编辑:我忘记了一些截屏:

这是角色扮演日期dim的关系图:

以下是这两种措施的视觉效果:

【讨论】:

这看起来不错,将尝试在我的报告中实施,看看这是否有效。 这需要大量修改。我现在的问题是,我们从日期仓库加载。我们的事实表具有日期键,而不是日期字段,它们位于维度表中。虽然现在我可以引入这些列并将它们添加到事实表中。这看起来像一个非常好的约会 Dim 表。你应该让它可用是 SQL! 我有一个需要大量清理的 SQL 版本。这适用于日期键。您可以轻松地将日期键导出或加入我共享的日期维度。获得密钥后,您可以按原样使用维度。您不应该尝试将其他暗淡的列放入事实中 幸运的是,DateDIM_KEY 只是一个数字索引。所以我将它添加到您的 DateDim 中,但是我没有得到任何返回值。我只尝试实现基于集合的。会尝试另一个。 除了TREATAS 之外,您可能还需要在CALCULATE 中添加ALL ( 'OpenDate' ), ALL ( 'CloseDate' ),具体取决于您的视觉对象的配置方式。不过,很高兴它正在工作。【参考方案2】:

最好的办法是添加一个自定义列(在编辑查询下),其中包含每月的日期差异。现在,您可以在 LeadTimeInMonth 列之后为您的场景进行过滤。如果您将字段拖放到视觉对象中,则可以按此列进行过滤。

Date.Month([ClosedDAte])-Date.Month([OpenDate])

我不确定您真正想要评估什么,但如果您需要确切地需要 ClosedDate between CurrentMonth and CurrentMonth + 2,您可以先从 ClosedDate 评估月份,然后是今天的月份,然后过滤结果。

【讨论】:

您需要更新您的差分公式以涵盖多年。想象一下 2018 年 12 月开盘和 2019 年 1 月关盘。那是 1-12=-11。如果负数,您可以添加 12 以在几个月内恢复到适当的交货时间。或者您可以利用月份的索引列,或者如果您从数据库中采购,您可以使用它的日期差分功能。你也可以在 M 持续时间类型中弄出一个月。

以上是关于请问SQL如何把当前月份加1个月,同时把日改成1日的主要内容,如果未能解决你的问题,请参考以下文章

SQL里怎么把日期截取为月份

当前日期增加自然月(比如当前时间为3月31号,加上1个月,预期结果是4月30日,但是输出了5月1日)

如何在SHELL获取当天时间的月份和上个月的月份还有下个月的月份

asp.net c#,我想取得当前月份,并且如果月份是单数的前面加0,请问代码是如何写?谢谢

在SQL中用getdate()把时间改为某年某月某日

如何从 Hive 表中获取月份 = 当前月份 else 月份 = 上个月(当前月份 - 1)的记录?