尝试将 7 位儒略日期转换为 MMDDYY 格式

Trying to convert a 7 digit julian date into MMDDYY format

我正在尝试将 7 位 julian/mainframe 日期转换为 SQL 服务器中格式为 mmddyy 的日历日期。 一个例子是儒略日期 2005020,其中前 4 位数字是年份 2005,后三位数字是日历中的日期,所以 020 = 1 月 20 日。所以我需要在 SQL 服务器中将此日期设置为 012005(MMDDYY)。

我一直在使用以下查询,但在加载几条记录后一直出现错误:

SELECT DATEADD(day,CAST(RIGHT([julianDateColumn],3) as int)-,LEFT([julianDateColumn],4))

我遇到的错误:

Conversion failed when converting date and/or time from character string.

最初我是在 Access DB 中使用“DATESERIAL”函数执行此操作,但从我在 SQL 服务器中看到的最接近的内容是“DATEFROMPARTS”,我尝试使用以下公式但它也没有用:

DATEFROMPARTS([julianDateColumn]/1000,1,[julianDateColumn] % 1000)

提前致谢!

最简单的似乎是把左边作为年份,再加上天数(-1)作为日期。此外,我不使用 MMDDYY 格式,而是直接使用 date 数据类型。如果你想要它的特定格式,那是你的表示层。

SELECT JulianDate,
       CONVERT(date,DATEADD(DAY,RIGHT(JulianDate,3)-1,CONVERT(datetime,LEFT(JulianDate,4)))) AS ActualDate --4 int strings are iterpreted as the year, so I'm going to take advantage of that
FROM (VALUES('2005020'))V(JulianDate);

根据对答案的评论,OP 中的一些日期似乎不符合规定的格式 (yyyyddd)。因此,我们可以在这里使用日历 table,在这里,然后 LEFT JOIN 看看你得到了哪些坏行(和 INNER JOIN 来获取日期)。

您可以用这样的东西创建 table:

CREATE TABLE dbo.CalendarTable (CalendarDate date NOT NULL PRIMARY KEY,
                                CalenderYear AS DATEPART(YEAR, CalendarDate) PERSISTED,
                                CalenderMonth AS DATEPART(MONTH, CalendarDate) PERSISTED,
                                CalenderDay AS DATEPART(DAY, CalendarDate) PERSISTED,
                                CalenderMonthName AS DATENAME(MONTH, CalendarDate),
                                JulianDate AS DATEPART(YEAR,CalendarDate) * 1000 + DATEDIFF(DAY,DATEFROMPARTS(DATEPART(YEAR, CalendarDate),1,1),CalendarDate) + 1 PERSISTED); --Some example columns



WITH N AS(
    SELECT N
    FROM (VALUES(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL))N(N)),
Tally AS(
    SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) -1 AS I
    FROM N N1, N N2, N N3, N N4, N N5, N N6),
Dates AS(
    SELECT CONVERT(date,DATEADD(DAY, T.I, '19000101')) AS CalendarDate
    FROM Tally T)
INSERT INTO dbo.CalendarTable(CalendarDate)
SELECT CalendarDate
FROM Dates
WHERE CalendarDate < '21000101';
GO

然后我们可以做这样的事情来获取坏行:

SELECT YT.JulianDate
FROM dbo.YourTable YT
     LEFT JOIN dbo.CalendarTable CT ON YT.JulianDate = CT.JulianDate
WHERE CT.JulianDate IS NULL;

我想我会使用 datefromparts()dateadd():

select dateadd(day,
               right(juliandate, 3) - 1),
               datefromparts(left(juliandate, 4), 1, 1)
              )
               
select Format(cast(concat(substring('2005020', 1, 4), '-', Month(cast(substring('2005020', 5, len('2005020')) as int)) ,'-', day(dateadd(day,-1,cast(substring('2005020', 5, len('2005020')) as int ) )  )) as date), 'MMddyy')