用年历更新数据库

fruv7luv  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(200)

使用java加载带有年历的数据库表的最佳方法是什么?
365天,每天一排。
我可以考虑写一个循环,每天更新/插入等等,有没有更简单的方法呢?通过api或公开的日历?
先谢谢你。

oyjwcjzk

oyjwcjzk1#

我可以考虑写一个循环,每天更新/插入等等,
是的,这就是路。这里没有魔术和银弹。
基本上,您的选择是:
您可以用java硬编码编程,通过jdbc在数据库中创建行。
编写一个文本文件供数据库直接导入,例如 COPY 发帖指挥。
编写sql脚本来定义表,并每年(或每年左右)插入行,由数据库架构迁移工具(如flyway或liquibase)执行。
就我个人而言,我会选择最后一个。使用迁移工具,您可以轻松地查看运行的内容和时间。而且,您可以轻松地将一个新的sql脚本放到生产环境中,在对脚本进行了预先测试之后,在下一年运行。
我会编写一个小的控制台应用程序来生成一个sql脚本草稿。然后手工编辑假期。像这样:

Year year = Year.of( 2021 );  // Input the year for which we want to create a calendar by way of a SQL script.
// Verify the requested year is in the future.
if ( ! Year.now().isBefore( year ) ) { throw new IllegalArgumentException( "Year must be in the future. Message # a0720f38-f4c5-4aca-9214-d9756a91e372." ); }
String filePath = "/Users/basilbourque/calendar_" + year + ".sql";

String newline = "\n";
StringBuilder sql = new StringBuilder();
sql.append( "INSERT INTO calendar_ ( date_ , holiday_us_ ) " ).append( newline );
LocalDate firstOfYear = year.atDay( 1 );
Stream < LocalDate > dates = firstOfYear.datesUntil( firstOfYear.plusYears( 1 ) );  // Generate a stream of `LocalDate` objects, for each date from start to end, using Half-Open approach where the ending is exclusive.
String joined = 
        dates
        .map( localDate -> "( '" + localDate.toString() + "' , FALSE )" )
        .collect( 
            Collectors.joining( ", " + newline , "VALUES " + newline , newline + " ; " )   // Pass delimiter, prefix, suffix.
        )
;
sql.append( joined );

System.out.println( "sql = " + newline + sql );

try
{
    Files.writeString( 
        Paths.get( filePath ) ,
        sql , 
        StandardCharsets.UTF_8 , 
        StandardOpenOption.CREATE_NEW 
    );
}
catch ( IOException e )
{
    e.printStackTrace();
}

当你跑的时候。

INSERT INTO calendar_ ( date_ , holiday_us_ ) 
VALUES 
( '2021-01-01' , FALSE ), 
( '2021-01-02' , FALSE ), 
…
( '2021-12-31' , FALSE )
 ;

通过api或公开的日历?
你可以找到这样的资源。但根据我的经验,大多数企业都有自己的日程表,即使与最接近的竞争对手相比,日程表也会有所不同。某些司法管辖区的某些行业(如美国的银行和信用合作社)可能有一些例外,这些行业都有一个特定的官方计划假日日历。但如果你的行业不是这样的,我建议你咬紧牙关,创建自己的日历定义工具,而不是依赖别人的日历。
365天,每天一排。
我想日期可能是这个表的一个自然键。将其定义为主键还将设置 UNIQUE ,防止意外重新加载数据。通常我觉得代理键最好,但我想在这里的日期自然键会很好的工作。
如果你提到的“价格”是一个分数,一定要使用 BigDecimal 键入java。并在数据库中使用适当的类型。例如,在postgres中,使用 NUMERIC 或者 DECIMAL 在这里和这里讨论。
听起来像是一个布尔值,每个国家(或每个司法管辖区或市场)将跟踪您的假期。当然,如果您经常添加和删除这样的假日计划,那么应该在子表中执行,而不是在日历表中作为列执行。
因此表定义可能如下所示:

CREATE TABLE calendar_
(
  date_ DATE NOT NULL ,
  holiday_us_ BOOLEAN NOT NULL ,
  rate_ DECIMAL ,
  CONSTRAINT pkey_calendar_ PRIMARY KEY ( date_ )
)
;

不需要存储年份或月份,因为这些可以从 DATE 列值。为年、月等添加列将违反数据库规范化。

相关问题