Sql 转换未知的六位数日期格式,可能是Julian的某个变体

Sql 转换未知的六位数日期格式,可能是Julian的某个变体,sql,database,date,datetime,cobol,Sql,Database,Date,Datetime,Cobol,我最近访问了一个遗留数据库,其中所有日期都以一种不熟悉的格式存储,我无法翻译,我的初步研究让我认为这是一种朱利安日期类型,但似乎有点不对劲 谢天谢地,有一个日期栏有一个普通的对应项,但还有许多其他日期只有六位数代码 你知道这些日期是什么,或者更重要的是,如何在这两种格式之间转换吗 例: 这是一个与更古老的COBOL程序相关的古老MS-SQL数据库。可能是自1600-12-31以来的天数 i、 e.1-Jan-1601=1等 希望查看不同年份的日期以进行确认 Cobol日期函数 正如萨金格鲁夫斯

我最近访问了一个遗留数据库,其中所有日期都以一种不熟悉的格式存储,我无法翻译,我的初步研究让我认为这是一种朱利安日期类型,但似乎有点不对劲

谢天谢地,有一个日期栏有一个普通的对应项,但还有许多其他日期只有六位数代码

你知道这些日期是什么,或者更重要的是,如何在这两种格式之间转换吗

例:


这是一个与更古老的COBOL程序相关的古老MS-SQL数据库。

可能是自1600-12-31以来的天数

i、 e.1-Jan-1601=1等

希望查看不同年份的日期以进行确认


Cobol日期函数 正如萨金格鲁夫斯指出的那样。Cobol的许多方言都具有将日期转换为自1600年12月31日起的日期的功能 这些职能包括:

INTEGER-OF-DATE converts YYYYMMDD date to Days-since 31-12-1600
INTEGER-OF-DAY  converts YYYYDDD  date to Days-since 31-12-1600

DATE-TO-INTEGER converts Days since 31-12-1600 to YYYMMDD
DAY-OF-INTEGER  converts Days since 31-12-1600 to YYYDDD

我是如何得到答案的 我注意到:

  • 152413-152409=4,2018-04-17为2018-04-13后4天
  • 152427-152413=14,2018-05-01为2018-04-17后14天
这不仅仅是一个计算日期的问题,它给出了1600年12月31日。
我还知道日期格式,其中日期存储为1600/1601的天数。不同年份的日期将确认布鲁斯·马丁的答案的格式

即使古老的SQL Server支持DATEADD/DATEDIFF,您也只需使用常量
109208
(两者之间的日期数)将开始日期修改为1900而不是1600即可


我相信COBOL日期格式基本上就是您所描述的格式,尽管我不确定年份是1600年还是1601年。@GordonLinoff-肯定是1601年。可能值得注意的是,这通常是使用函数INTEGER-of-DAY的结果,如果您想知道公历日期是什么,可以使用DAY-of-INTEGER返回日期。
INTEGER-OF-DATE converts YYYYMMDD date to Days-since 31-12-1600
INTEGER-OF-DAY  converts YYYYDDD  date to Days-since 31-12-1600

DATE-TO-INTEGER converts Days since 31-12-1600 to YYYMMDD
DAY-OF-INTEGER  converts Days since 31-12-1600 to YYYDDD
dateadd(day, (legacydatecol- 109208), 0)     as legacy2date
datediff(day, '19000101', datecol ) + 109208 as date2legacy