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