sqlserver-sql:如果是新月份的第一天,则运行上个月的报告



我有一些报告运行,显示数据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()

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

请注意,每个事例表达式的else部分设置第一个和最后一个日期的当前日期。如果需要,可以将它们设置为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

谢谢大家。所以兔子洞更深了一点例如:星期六第一天是什么时候?

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

我最终使用的是一个使用我们的工作时间表的函数

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))

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

-- 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

对我来说,这似乎就像从当前日期减去1天来获得开始日期一样简单

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

然后你只需要使用当前日期而不使用时间来获得结束日期

SELECT EndDate =
    CONVERT(DATE, GETDATE()

那么您的查询是WHERE date >= StartDate and < EndDate

最新更新