【问题标题】:SQL UPDATE Function Date Columns using MS-SQLSERVER使用 MS-SQL SERVER 的 SQL UPDATE 函数日期列
【发布时间】:2017-03-27 14:48:17
【问题描述】:

我有一个包含 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 函数,它会给我正在寻找的结果。伪代码也将受到欢迎。

提前致谢。

【问题讨论】:

  • 为什么 2017 年 3 月 2 日被指定为 2017 年 2 月 2 日?并且基于 3 月,4 月 7 日不是 4 月 1 日吗?
  • 好吧,您在提供示例数据方面做得很好,现在您要做的就是添加您想要的结果和当前尝试。
  • 预期的输出/结果?
  • 我每个月都有 2 个批处理日期 @SqlZim 或者每月 1 号的第 3 天,或者从第 4 号开始的其余时间将是每月的第 2 天。
  • @ZoharPeled 我已经尝试使用 DateAdd 和一个我没有获胜的案例陈述,我希望让我的方法保持开放,看看还有什么其他方法。

标签: sql sql-server date sql-update


【解决方案1】:

使用两个 case 表达式来修改日期到月份的截断。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-07
    • 2012-08-21
    • 1970-01-01
    • 2010-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多