【问题标题】:SQL copy and increase value in same tableSQL复制并在同一张表中增加值
【发布时间】:2014-01-27 16:54:11
【问题描述】:

我有一个公共假期表,包含以下列:

PublicHolidayID,
PublicHolidayDate,
PublicHolidayName,
IsStatic,

例如:24 December 2014 是圣诞节,它是静态日期。

我正在寻找一种获取所有静态假期的方法,添加一年并将它们插入同一个表中,为明年自动更新,因此用户不必手动添加它们。

我遇到的问题是它第一次工作,我得到24/12/2014-24/12/2015。我第二次调用我得到的程序:24/12/2014-24/12/2014-24/12/2015-24/12/2015-24/12/2016-24/12/2016

下次我调用该程序时可以想象一下会发生什么

任何帮助都会很好......

【问题讨论】:

  • 你使用什么数据库引擎?
  • 你希望自动更新脚本如何运行,如果它在明年运行一次的话;然后只需选择该特定年份的所有内容并添加一年即可运行;插入表(列)从表中选择(列+add1year),其中yearofdate = something并且isstatic = true也不可能使日期唯一
  • 你已经尝试过什么?虽然是一个简单的问题,但有时提供现有代码会有所帮助,这样用户就可以了解您可能做错了什么,而不是盲目地为您提供解决方案
  • 为什么你甚至想为明年做一份工作。如果您在未来 50 年内填充该表,该表将有多少行?除非有业务要求限制将预先填充的公共假期超过本年度。您可以获得 max(YEAR) GroupBy Month+Day 并继续为 IsStatic=1 的所有行添加年份。您可以通过循环、窗口函数、光标和许多其他方式做到这一点。

标签: sql


【解决方案1】:

如果您每年运行一次查询以创建明年的所有假期, 安排一个作业每年运行一次以下内容

INSERT INTO PublicHolidays (HolidayDate,Name,IsStatic)
SELECT Dateadd(year,1,HolidayDate),Name,IsStatic
FROM PublicHolidays 
WHERE IsStatic=1 
      AND  YEAR(holidaydate) = datepart(year,getdate())

如果您想为未来 100 年填充表格,请执行以下操作:

DECLARE @i INT;
SELECT @i = 1;
SET NOCOUNT ON
WHILE @i <= 100
BEGIN
    INSERT INTO PublicHolidays (HolidayDate,Name,IsStatic)
    SELECT Dateadd(year,@i,HolidayDate),Name,IsStatic
    FROM PublicHolidays 
    WHERE IsStatic=1 
       AND  YEAR(holidaydate) = datepart(year,getdate())
    SELECT @i = @i + 1;
END;
SET NOCOUNT OFF

【讨论】:

    【解决方案2】:

    SQL Server 解决方案

    insert into PublicHolidays (HolidayDate,Name,IsStatic)
    select Dateadd(year,1,HolidayDate),Name,IsStatic
    from PublicHolidays where IsStatic=1 and YEAR(holidaydate) = 2014
    

    【讨论】:

    • OP 正在寻找无需更改即可运行并提供明年日期的代码。上述查询仅适用于 2015 年,然后他必须在明年再次更改该代码。
    • YEAR(GETUTCDATE()) -- 每 12 月 31 日运行一次
    • 谢谢大佬,这么简单……一定是想多了这个问题。
    猜你喜欢
    • 2013-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-13
    • 1970-01-01
    相关资源
    最近更新 更多