使用MS-SQLSERVER

时间:2017-03-27 14:48:18

标签: sql sql-server date sql-update

我有一个由2个日期列组成的表。一列是交易日期,下一列是我用作批日期的日期,我根据交易日期的哪一天对日期进行分组。 我的表用于演示目的是基于此sql脚本构建的

CREATE TABLE [DateDemo1](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [mydate] [datetime] NULL,
    [batchdate] [datetime] NULL
)

我插入的现有数据是(日期格式为dd / mm / yyyy)

INSERT INTO [DateDemo]([mydate],[batchdate])  VALUES ('01/03/2017', '01/03/2017')
INSERT INTO [DateDemo]([mydate],[batchdate])  VALUES ('02/03/2017', '01/03/2017')
INSERT INTO [DateDemo]([mydate],[batchdate])  VALUES ('03/03/2017', '01/03/2017')
INSERT INTO [DateDemo]([mydate],[batchdate])  VALUES ('06/03/2017', '01/03/2017')
INSERT INTO [DateDemo]([mydate],[batchdate])  VALUES ('01/04/2017', '01/04/2017')
INSERT INTO [DateDemo]([mydate],[batchdate])  VALUES ('02/04/2017', '01/04/2017')
INSERT INTO [DateDemo]([mydate],[batchdate])  VALUES ('03/04/2017', '01/04/2017')
INSERT INTO [DateDemo]([mydate],[batchdate])  VALUES ('04/04/2017', '01/04/2017')
INSERT INTO [DateDemo]([mydate],[batchdate])  VALUES ('05/04/2017', '01/04/2017')
INSERT INTO [DateDemo]([mydate],[batchdate])  VALUES ('06/04/2017', '01/04/2017')
INSERT INTO [DateDemo]([mydate],[batchdate])  VALUES ('07/04/2017', '01/04/2017')

我打算将每行的批处理日期更新为组(本月的第1天或本月的第2天)。使用确定每个行条目的月份的第3天将被分类。例如,2017年3月2日的行应该属于2017年2月2日的批次日期。 2017年3月3日将是2017年3月1日的批次日期,2017年3月4日将是2017年3月2日的批日期,为了论证,4月7日将是2017年4月2日的批次日期。 我希望的结果集我希望它如下

id,    mydate,      batchdate
    1, 01/03/2017 ,  02/02/2017 
    2, 02/03/2017 ,  02/02/2017 
    3, 03/03/2017 ,  01/03/2017 
    4, 06/03/2017 ,  02/03/2017 
    5, 01/04/2017 ,  02/03/2017 
    6, 02/04/2017 ,  02/03/2017 
    7, 03/04/2017 ,  01/04/2017 
    8, 04/04/2017 ,  02/04/2017 
    9, 05/04/2017 ,  02/04/2017 
    10, 06/04/2017 ,  02/04/2017 
    11, 07/04/2017 ,  02/04/2017 

我需要一个SQL UPDATE函数,它将为我提供我正在寻找的结果。伪代码也将受到欢迎。

提前致谢。

1 个答案:

答案 0 :(得分:0)

使用两个案例表达式修改截断日期到月份。

update DateDemo
  set batchdate = dateadd(day
                   , case when day(mydate) = (3) then 0 else 1 end
                   , dateadd(month, datediff(month, 0, mydate ) 
                       + case when day(mydate) in(1,2) then -1 else 0 end
                   , 0)
                  );
select 
    mydate
  , batchdate
from DateDemo;

rextester演示:http://rextester.com/CKGNS20776

返回:

+------------+------------+
|   mydate   | batchdate  |
+------------+------------+
| 2017-03-01 | 2017-02-02 |
| 2017-03-02 | 2017-02-02 |
| 2017-03-03 | 2017-03-01 |
| 2017-03-06 | 2017-03-02 |
| 2017-04-01 | 2017-03-02 |
| 2017-04-02 | 2017-03-02 |
| 2017-04-03 | 2017-04-01 |
| 2017-04-04 | 2017-04-02 |
| 2017-04-05 | 2017-04-02 |
| 2017-04-06 | 2017-04-02 |
| 2017-04-07 | 2017-04-02 |
+------------+------------+