Sql 需要为日期逻辑编写查询

Sql 需要为日期逻辑编写查询,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我有一个下面的查询,它有一个日期过滤器,如“2015-02-01”和“2015-06-01”之间的EST\u PICK\u date,其中逻辑是EST\u PICK\u date应该是从当前月份开始的3个月和下个月的第一个日期。 也就是说,对于当月5月,EST拾取日期应介于'2015-02-01'和'2015-06-01'之间 我需要动态地写下面的查询。 在下面的查询中,我已经硬编码了值'2015-02-01'和'2015-06-01',但它应该是动态的。 如何做到这一点?我在SSIS包中使用此

我有一个下面的查询,它有一个日期过滤器,如“2015-02-01”和“2015-06-01”之间的
EST\u PICK\u date
,其中逻辑是
EST\u PICK\u date
应该是从当前月份开始的3个月和下个月的第一个日期。 也就是说,对于当月5月,
EST拾取日期应介于
'2015-02-01'
'2015-06-01'
之间
我需要动态地写下面的查询。
在下面的查询中,我已经硬编码了值
'2015-02-01'
'2015-06-01'
,但它应该是动态的。
如何做到这一点?我在SSIS包中使用此查询,所以我应该在SQL级别执行,还是应该在包中实现此逻辑?如果是,如何进行

INSERT INTO STG_Open_Orders (Div_Code, net_price, gross_price)
SELECT ord.DIV_CODE AS Div_Code, ord_l.NET_PRICE AS net_price, ord_l.gross_price AS gross_price, 
FROM ORD ord inner join ORD_L ord_l ONord.ORD_ID=ord_l.ORD_ID
WHERE ord_l.EST_PICK_DATE BETWEEN '2015-02-01' AND'2015-06-01'
试试这个

INSERT INTO STG_Open_Orders (Div_Code, net_price, gross_price)
SELECT ord.DIV_CODE AS Div_Code, ord_l.NET_PRICE AS net_price, ord_l.gross_price AS gross_price, 
FROM ORD ord inner join ORD_L ord_l ONord.ORD_ID=ord_l.ORD_ID
WHERE ord_l.EST_PICK_DATE BETWEEN DATEADD(m, DATEDIFF(m, 0,DATEADD(month,-3,getdate())), 0) AND DATEADD(m, DATEDIFF(m, 0,DATEADD(month,1,getdate())), 0)
这是您的开始日期和结束日期函数

SELECT DATEADD(m, DATEDIFF(m, 0,DATEADD(month,-3,getdate())), 0)
2015-02-01 00:00:00.000

SELECT DATEADD(m, DATEDIFF(m, 0,DATEADD(month,1,getdate())), 0)
2015-06-01 00:00:00.000
具体日期:

Declare @YourDate as date = '6/3/2015' -- note the format is mm/dd/yyyy
SELECT CAST(DATEADD(m, DATEDIFF(m, 0,DATEADD(month,-3,@YourDate)), 0) as date)
SELECT CAST(DATEADD(m, DATEDIFF(m, 0,DATEADD(month,1,@YourDate)), 0) as date)
您可以使用和一些sql技巧来获取每月的第一天:

INSERT INTO STG_Open_Orders (Div_Code, net_price, gross_price)
SELECT ord.DIV_CODE AS Div_Code, 
       ord_l.NET_PRICE AS net_price, 
       ord_l.gross_price AS gross_price, 
FROM ORD ord 
inner join ORD_L ord_l ONord.ORD_ID=ord_l.ORD_ID
WHERE ord_l.EST_PICK_DATE BETWEEN 
DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE())-3, 0) -- first day 3 months ago
AND 
DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE())+1, 0) -- first day next month
尝试此操作(根据系统中的当前日期):


应该动态获取什么?使用Dateadd函数Hi Giorgi,应该使用上述逻辑动态获取EST_PICK_DATE DATE。Thanks@ramu,什么是输入?当前日期?本月的第一天还是什么?嗨,普拉文,谢谢你的回复,假设我们在六月份。Ex今天的日期是6月3日,因此应该在“2015-03-01”和“2015-07-01”之间选择日期。上述逻辑是否适用于此?是的,它应该。。理想情况下,它将按照我们指定的日期计算。。现在我们使用getdate(),您可以将@yourdate置于检查状态。很高兴我能提供帮助。谢谢。嗨,praveen,我需要日期格式的EST_PICK_日期,如“2015-02-01”。我尝试了这个select DATEADD(m,DATEDIFF(m,0,DATEADD(month,-3,CONVERT(DATE,getdate())),0),但是它给了我'2015-02-01 00:00:00.000',但我需要'2015-02-01',我错在哪里?你需要使用cast将datetime转换为日期,例如,选择cast(DATEADD(m,DATEDIFF(m,0,DATEADD(month,-3,@YourDate)),0)作为日期)选择cast(DATEADD(m,DATEDIFF(m,0,DATEADD(month,1,@YourDate)),0)作为日期)谢谢Arkadiusz,praveen的答案对我有用…谢谢你宝贵的时间…谢谢zohar,praveen的答案对我有用…谢谢你宝贵的时间…基本上答案是一样的…只要问题解决了,没有人浪费时间:-)
    SELECT ord.DIV_CODE AS Div_Code, ord_l.NET_PRICE AS net_price, ord_l.gross_price AS gross_price, 
    FROM ORD ord inner join ORD_L ord_l ONord.ORD_ID=ord_l.ORD_ID
    WHERE ord_l.EST_PICK_DATE BETWEEN DATEADD(month, DATEDIFF(month, 0, getdate())-3, 0) AND DATEADD(month, DATEDIFF(month, 0, getdate())+1, 0)