Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL日期范围从上个月末到上一年的年初至今_Sql Server_Date - Fatal编程技术网

Sql server SQL日期范围从上个月末到上一年的年初至今

Sql server SQL日期范围从上个月末到上一年的年初至今,sql-server,date,Sql Server,Date,有一个查询,其中日期范围需要是上个月结束时的年初至今日期,以及上一年的相应日期范围。我有一个“公式”,用月份和年份的数值定义日期范围。e、 上个月的月末是本月减去1。这项工作一直很有效,直到我到了一月份,成为今年的第一名,而今年我无法使用 我不是一个有经验的SQL用户,我已经用谷歌了解了我所知道的大部分内容,但没有成功地找到这个问题的答案——找到了上个月底的公式,但没有找到下面剩下的三个日期 DECLARE @PYStart datetime = '1/1/2015' DECLARE @PYEn

有一个查询,其中日期范围需要是上个月结束时的年初至今日期,以及上一年的相应日期范围。我有一个“公式”,用月份和年份的数值定义日期范围。e、 上个月的月末是本月减去1。这项工作一直很有效,直到我到了一月份,成为今年的第一名,而今年我无法使用

我不是一个有经验的SQL用户,我已经用谷歌了解了我所知道的大部分内容,但没有成功地找到这个问题的答案——找到了上个月底的公式,但没有找到下面剩下的三个日期

DECLARE @PYStart datetime = '1/1/2015'
DECLARE @PYEnd datetime = '12/31/2015' 
DECLARE @CYStart datetime = '1/1/2016' -- first day of previous month's year
DECLARE @CYEnd datetime = CONVERT(varchar, DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE()),0)),101) -- last day of past month

SELECT YEAR(transaction_date) as 'Year', MONTH(transaction_date) as 'Month'

FROM TABLE_Q1

WHERE((transaction_date BETWEEN @pystart and @pyend) OR (transaction_date BETWEEN @cystart AND @cyend))

group by year(transaction_date), month(transaction_date)
-以下输出;

这实际上相当直截了当,尽管最好的方法可能取决于您要从范围中选择日期的字段是否包含时间。这个答案可以处理这两种情况

DECLARE @CYEnd datetime = CONVERT(varchar, DATEADD(day, -(DATEPART(day, GETDATE()) - 1), 101) -- First day of Current month
DECLARE @CYStart datetime = Cast(Cast(DATEPART(year, DATEADD(day, -1, @CYEnd)) as varchar(4)) + '0101' AS date)
DECLARE @PYEnd datetime = DATEADD(year, -1, @CYEnd)
DECLARE @PYStart datetime = dateadd(year, -1, @CYStart)

SELECT YEAR(transaction_date) as 'Year', 
    MONTH(transaction_date) as 'Month'
FROM TABLE_Q1

WHERE 
    (transaction_date >= @pystart and transaction_date < @pyend) 
    OR 
    (transaction_date >= @cystart AND transaction_date < @cyend)
group by 
    year(transaction_date), 
    month(transaction_date)
工作原理 假设当前日期为2016年3月10日。在这种情况下,@CYEnd的值为2016-03-01,@PYEnd的值为2015-03-01。无论日期是否附有时间,检查transaction_date>=@pystart和transaction_date<@pyend和transaction_date>=@cystart和transaction_date<@cyend都将正确返回所需的记录。使用2016-02-29作为@CYEnd的中间测试将错过包括时间的所有日期,尽管如果没有时间记录为筛选字段的一部分,它将返回正确答案


这也很好地处理了闰年,因为02/29或02/28都是<03/01。

YTD代表什么?向我们展示示例数据和预期输出。请阅读,这里是一个学习如何提高问题质量和获得更好答案的好地方。在本例中,从上个月底算起,将是今年迄今为止。例如,截止到今天,它将是2016年1月1日至2016年12月31日,但如果说在今年3月,它将是2017年1月1日至2017年2月28日。对不起,我不熟悉这个术语。你能解释一下逻辑吗?看起来怪怪的,你上个月找不到。这方面有几个例子。找到了上个月底的公式,但不是下面剩下的三个日期-找到上个月底的答案并不困难,所以我遇到的问题是其他三个日期。在发布之前,我广泛搜索了SO和其他资源,并阅读了how to ask页面——尽我所能解释我如何定义日期范围,但好像我不是一个有经验的sql用户,可能不熟悉正确的行话一样——非常乐意扩展任何可能令人困惑的内容。谢谢你的时间和帮助非常感谢你抽出时间来帮助我!它的工作原理也很有帮助,逻辑也很清楚,很有意义。肯定会在其他日期范围内使用。当我运行查询时,它导致了一个错误,我跟踪到了当前年终@CYEnd。我用CONVERTvarchar、DATEADDs、-1、DATEADDmm、DATEDIFFm、0、GETDATE、0101替换了@CYEnd的公式,结果非常好。我不完全确定它为什么不起作用可能是我的原因,但它现在运行顺利,感谢您的帮助!这是一次很棒的学习经历!