SQL:如果是新月的第一天,则运行上个月的报告

时间:2015-07-02 11:39:56

标签: sql-server tsql date

我有一些报告显示数据MTD

这是我想要的代码

StartDate = select dateadd(s,0,dateadd(mm, datediff(m,0,getdate()),0))
EndDate = getdate()

我们的数据复制发生在每天结束时。 因此,在每个月的第一天,我不想要一个空白的报告。

我想要发生什么。

仅当该月的第一天, StartDate 必须在上个月开始, EndDate 才能在上个月结束。否则使用

StartDate = select dateadd(s,0,dateadd(mm, datediff(m,0,getdate()),0)) and 
EndDate = getdate()

4 个答案:

答案 0 :(得分:0)

不完全确定您的主要查询。这就是你如何获得上个月的第一天和最后一天,具体取决于当月的第一天。

请注意,除了每个案例表达式的一部分,设置第一个和最后一个日期的当前日期。如果需要,您可以将它们设置为null

DECLARE @Today DATETIME = GETDATE()

DECLARE @FirsDay DATETIME = CASE WHEN DATEPART(DAY, @Today) = 1 
                            THEN DATEADD(MONTH, -1, @Today) --first day of last month
                            ELSE @Today END --current date for other dates

DECLARE @LastDay DATETIME = CASE WHEN DATEPART(DAY, @Today) = 1 
                            THEN DATEADD(DAY, -1, @Today) --last date of last month
                            ELSE @Today END --current date for other dates

答案 1 :(得分:0)

您可以尝试使用以下内容:

-- Create demo data
CREATE TABLE #dates(get_date_simulation datetime)

INSERT INTO #dates(get_date_simulation)
VALUES  (N'2015-07-01 13:46:47.063'), -- fallback to 2015-06-01
        (N'2015-07-02 13:46:47.063') -- use this date normal

-- Your part
SELECT  get_date_simulation, 
        CASE 
            WHEN DATEPART(day,get_date_simulation) = 1
            THEN DATEADD(month,-1,DATEADD(day,(DATEPART(day,get_date_simulation)-1)*-1,get_date_simulation))
            ELSE DATEADD(day,(DATEPART(day,get_date_simulation)-1)*-1, get_date_simulation)
        END as start_date, 
        CASE 
            WHEN DATEPART(day,get_date_simulation) = 1
            THEN DATEADD(second,-1,CONVERT(datetime,CONVERT(date,get_date_simulation)))
            ELSE get_date_simulation
        END as end_date
FROM #dates

-- Cleanup
DROP TABLE #dates

结果如下:

get_date_simulation     start_date              end_date
----------------------- ----------------------- -----------------------
2015-07-01 13:46:47.063 2015-06-01 13:46:47.063 2015-06-30 23:59:59.000
2015-07-02 13:46:47.063 2015-07-01 13:46:47.063 2015-07-02 13:46:47.063

答案 2 :(得分:0)

谢谢大家。 所以兔子洞变得更深了 例如:第一场比赛何时落在周六?

如果是新月的第一天,我需要在最后一个交易日运行。

我最终使用的是一个使用我们工作时间表的功能

ALTER FUNCTION [data].[Last_Trade_Day] (@Date date)
returns date as

begin
    declare @OrigDate date = isnull(@Date, getdate())
    return (
        select max(convert(date, wh_starttime))
        from Embrace.fact.Working_Hours
        where convert(date, wh_starttime) < @OrigDate
    )
end

报告中的代码现在看起来像:

declare @EndDate date = Embrace.data.Last_Trade_Day(isnull(@Date, getdate()))
declare @StartDate date = dateadd(mm, 0, dateadd(mm, datediff(m, 0, @EndDate), 0))

答案 3 :(得分:0)

对我而言,从当前日期减去1天以获得开始日期似乎很简单

SELECT StartDate =
    DATEADD(s,0,DATEADD(mm,DATEDIFF(m,0,GETDATE() - 1),0))

然后,您只需使用当前日期获得结束日期

SELECT EndDate =
    CONVERT(DATE, GETDATE()

然后您的查询为WHERE date >= StartDate and < EndDate