【问题标题】:Modify DATE in COLUMN using CASES and LOOP使用 CASES 和 LOOP 修改 COLUMN 中的 DATE
【发布时间】:2019-10-14 15:06:40
【问题描述】:

我有一个月的数据。

DATE       | AMOUNT
04/01/2019 | 3437824
04/02/2019 | 234834
04/03/2019 | 2343478
.
.
.
04/30/2019 | 343729

我想更改日期列给我这样的东西

OLDDATE    | DATE       | AMOUNT
04/01/2019 | 01/01/2019 | 3437824
04/02/2019 | 02/01/2019 | 234834
04/03/2019 | 03/01/2019 | 2343478
.
.
.
04/12/2019 | 12/01/2019 | 328456
04/13/2019 | 01/02/2019 |845754
04/14/2019 | 02/02/2019 |845754
.
.
04/24/2019 | 12/02/2019 |845754
04/25/2019 | 01/03/2019 |845754
04/26/2019 | 02/03/2019 |845754
.
.
.
04/30/2019 | 06/03/2019 | 343729

我尝试在 while 循环中使用 switch case 来实现同样的效果,但无法获得所需的结果

BEGIN
DECLARE @Mth INT = 1;
DECLARE @Iteration INT = 1;

WHILE @Iteration != 1000000
    BEGIN
        WHILE @Mth <= 12
            BEGIN
                UPDATE TACC
                SET BUSINESSDATE = 
                CASE 
                    WHEN DAY([BUSINESSDATE])<13  
                    THEN datefromparts(year([BUSINESSDATE]), @Mth, 1)  
                    WHEN DAY([BUSINESSDATE]) BETWEEN 13 AND 24 
                    THEN datefromparts(year([BUSINESSDATE]), @Mth, 2) 
                    ELSE datefromparts(year([BUSINESSDATE]), @Mth, 3)
                END
                SET @Mth = @Mth + 1 
                IF @Mth=13 
                    BEGIN   
                        SET @Mth=1
                    END
            END
        SET @Iteration = @Iteration + 1
    END
END

如果我必须为 1000 万行执行此操作,那么 T-SQL 或 DAX 哪种方法更好

【问题讨论】:

  • 这和DAX有什么关系?

标签: sql-server tsql date


【解决方案1】:

基本上,我们需要将行分成12 的组,并为每个组增加新日期的月份部分。需要对每个组中的行进行排序,并且我们需要将每个新日期的天部分增加一个。

您可以使用ROW_NUMBER 对行进行排序并将它们分组。然后你可以使用DATEADD为每一行建立新的日期:

DECLARE @DataSource TABLE
(
    [DATE] DATETIME2(0)
   ,[AMOUNT] INT
);

INSERT INTO @DataSource ([DATE], [AMOUNT])
VALUES ('2019-04-01', 100)
      ,('2019-04-02', 100)
      ,('2019-04-03', 100)
      ,('2019-04-04', 100)
      ,('2019-04-05', 100)
      ,('2019-04-06', 100)
      ,('2019-04-07', 100)
      ,('2019-04-08', 100)
      ,('2019-04-09', 100)
      ,('2019-04-10', 100)
      ,('2019-04-11', 100)
      ,('2019-04-12', 100)
      ,('2019-04-13', 100)
      ,('2019-04-14', 100)
      ,('2019-04-15', 100)
      ,('2019-04-16', 100)
      ,('2019-04-17', 100)
      ,('2019-04-18', 100)
      ,('2019-04-19', 100)
      ,('2019-04-20', 100)
      ,('2019-04-21', 100)
      ,('2019-04-22', 100)
      ,('2019-04-23', 100)
      ,('2019-04-24', 100)
      ,('2019-04-25', 100)
      ,('2019-04-26', 100)
      ,('2019-04-27', 100)
      ,('2019-04-28', 100)
      ,('2019-04-29', 100);

DECLARE @StartDate DATETIME2 = '2019-01-01'
       ,@Step TINYINT = 12;

WITH DataSource ([OLDDATE], [AMOUNT], [AddMonth]) AS
(
    SELECT *
          ,(ROW_NUMBER() OVER (ORDER BY [Date] ASC) -1 ) / 12 
    FROM @DataSource
)
SELECT [OLDDATE] 
      ,[AMOUNT] 
      ,DATEADD(DAY, ROW_NUMBER() OVER (PARTITION BY [AddMonth] ORDER BY [OLDDATE] ASC) - 1, DATEADD(MONTH, [AddMonth], @StartDate))
FROM DataSource;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-26
    • 2020-01-19
    • 1970-01-01
    • 1970-01-01
    • 2021-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多