【问题标题】:Convert SQL Date to JDE Date将 SQL 日期转换为 JDE 日期
【发布时间】:2017-07-26 20:23:14
【问题描述】:

我有一个格式为2017-07-27T10:00:00Z 的输入日期,需要转换为JDE(117208),谁能帮我在SQL 或XSLT 中进行操作。我真的很感谢你的帮助。

我需要一个相同的 SQL 查询

input format : 2017-07-27T10:00:00Z output format : 117208

【问题讨论】:

标签: sql xslt date-conversion


【解决方案1】:

这是您需要的查询。

SELECT TO_CHAR(CAST(TO_TIMESTAMP_TZ(REPLACE('2017-07-27T10:00:00Z', 'T', ''), 'YYYY-MM-DD HH:MI:SS TZH:TZM') AS DATE), 'J') as JULIAN
FROM    dual

【讨论】:

  • 您好 JRG,但我期待的 julain 日期是给定日期的 117208。你能帮帮我吗?
  • 对于输入 2017-07-27T10:00:00Z 预期的儒略日期是 117208(CYYDDD) 格式。
【解决方案2】:

很简单,你可以在一行中做到这一点:

select dat, concat(datediff(year,'1900-1-1',dat) /100,datediff(year,'1900-1-1',dat) % 100, datepart(DAYOFYEAR,dat) ) as JDE from d

我将您的示例输入数据存储在 dat 列下的表调用 d 中:

dat        JDE
---------- ------------------------------------
2017-07-27 117208

说明:

首先了解什么是 JDE 朱利安日期很重要。它的格式是 CYYDDD:

  • C 代表几个世纪,它始于 20 世纪(因此在我的查询中硬编码日期 1900-01-01)。如果年份是 19xx,则 C 为 0。对于 2000 年的年份,C 为 1。这就是为什么我们使用您的日期并获得自 1900-01-01 以来不同年份的数量,然后将其除以 100 以获得世纪数。 datediff(year,'1900-1-1',dat) /100
  • YY 代表世纪中的年份。因此,如果年份是 2089,则 JDE 的前三位将是 189DDD datediff(year,'1900-1-1',dat) % 100 帮助您获得本世纪的剩余时间,即年份。
  • DDD 是一年中的某一天。在 sql server 中,使用datepart(DAYOFYEAR,dat) 获得一年中的一天非常好

现在我们得到了 JDE 的所有三个部分,我们 concat() 将它们放在一起,您就拥有了自己的 JDE 年。

编辑:

我添加了一些逻辑来确保所有字段都有正确的 0 填充。

SELECT dat ,CONCAT(RIGHT(CONVERT(varchar(1),datediff(year,'1900-1-1',dat) / 100),1) , RIGHT(CONVERT(varchar(2), datediff(year,'1900-1-1',dat) % 100),2), RIGHT('000' + CONVERT(varchar(3),datepart(DAYOFYEAR,dat)),3)) from d

【讨论】:

  • 你能说清楚吗。非常感谢您的帮助。
  • 我认为预期的输出是 JDE 日期
  • 啊,这更有意义。我想我仍然知道该怎么做。让我继续努力,完成后我会更新我的答案。
  • 我更新了它,我会添加一些解释。同时看看它是否适合你
  • 我在 SQL 方面并不是那么完美。如果你能说清楚,我真的很感激。
【解决方案3】:

JDE 使用的日期格式,即 CYYDDD,似乎在 JDE 用户社区中通常被称为儒略日期,但实际上它与儒略日数字无关,因为该术语在其余部分中通常被理解世界的。 (此外,为了清楚起见,儒略日数字与儒略历无关。)

如果使用正确,儒略日数指的是从中午开始的 24 小时周期,但我确信这不适用于 JDE 日期。

所以你说朱利安日期而不是 JDE 日期让每个人都感到困惑。

在 XSLT 2.0 中,您可以使用 JDE 日期的最后五个字符

format-date($date, '[Y01][d001]')

但是对于第一个字符,您需要自定义逻辑:

if ($date lt xs:date('2000-01-01')) then '0' else '1'

或者,如果您愿意,

year-from-date($date) idiv 100 - 19

它的优点是工作超过2100。

【讨论】:

    【解决方案4】:

    你可以试试。

    select DATEPART(yyyy,GETDATE())*1000+DATEPART(DAYOFYEAR,GETDATE())-1900000
    

    日期格式应为 (YYYY-MM-DD)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-29
      • 2016-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-03
      • 1970-01-01
      相关资源
      最近更新 更多