Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tsql 将日期转换为Julian日期,然后存储在SQL Server 2005中的数字字段中_Tsql_Sql Server 2005 - Fatal编程技术网

Tsql 将日期转换为Julian日期,然后存储在SQL Server 2005中的数字字段中

Tsql 将日期转换为Julian日期,然后存储在SQL Server 2005中的数字字段中,tsql,sql-server-2005,Tsql,Sql Server 2005,我在T-SQL变量中有一个日期字段,我想将其转换为Julian日期格式,然后插入到表中的数值列中。有人能帮忙吗 我看到有一些关于朱利安约会的帖子,但我无法通过 例: 上述语句确实转换为朱利安日期,但格式不正确。例如,如果今天是2014年2月15日,则应将其转换为114046,但将其转换为735279 同样,一旦转换成正确的朱利安格式。我想将其转换为数字,就像我想插入表中的Numeric列一样 如果以前有人问过这个问题,我很抱歉。我是SQLServer2005新手 任何帮助都将不胜感激 问候试试看

我在T-SQL变量中有一个日期字段,我想将其转换为Julian日期格式,然后插入到表中的
数值列中。有人能帮忙吗

我看到有一些关于朱利安约会的帖子,但我无法通过

例:

上述语句确实转换为朱利安日期,但格式不正确。例如,如果今天是2014年2月15日,则应将其转换为114046,但将其转换为735279

同样,一旦转换成正确的朱利安格式。我想将其转换为数字,就像我想插入表中的
Numeric
列一样

如果以前有人问过这个问题,我很抱歉。我是SQLServer2005新手

任何帮助都将不胜感激

问候

试试看:

DECLARE @input_date DATETIME

SELECT @input_date = getdate()

SELECT datepart(year, @input_date) * 1000 + datepart(dy, @input_date)

上面的答案似乎对我不起作用

--If Julian Format is defined as CYYJJJ where: 
--  C is the number of centuries since 1900-01-01 
--  YY is the 2 digit year 
--  JJJ is the day number of the given YY year

--Convert Date => Julian uning CYYJJJ

declare @date datetime = '02/15/2014' 
select (datepart(year, @date)-1900)*1000 + datepart(dy, @date) 
--output: 114046

--Convert Julian => Date using CYYJJJ

declare @jdate int = 114046 
select dateadd(dd, (@jdate - ((@jdate/1000) * 1000)) - 1, dateadd(yy, @jdate/1000 - 1900, 0))
--output: '02/15/2014'

---

--Convert Date => Julian uning YYYYJJJ

declare @dateB datetime = '02/15/2014' 
select (datepart(year, @dateB))*1000 + datepart(dy, @dateB) 
--output: 114046

--Convert Julian => Date using YYYYJJJ
declare @jdateB int = 2014046 
select dateadd(dd, (@jdateB - ((@jdateB/1000) * 1000)) - 1, dateadd(yy, @jdateB/1000 - 1900, 0)) 
--output: '02/15/2014'
我建议将其放入标量函数中,这样您就可以像这样执行它:

select dbo.FromJulianDate(2014046)

来源于

这应该满足您的需求:

SELECT CONCAT((DATEPART(year, @date) -1900),(DATEPART(dy, @date)))

以下内容将提供7个字符的儒略日期输出:YYYYDDD

SELECT datepart(year, @input_date) * 1000 + datepart(dy, @input_date)

下面将给出6个字符的julian日期输出:CYYDDD

SELECT CONCAT((DATEPART(year, @input_date) -1900),(DATEPART(dy, @input_date)))
进一步解释

  • 朱利安的日期从1900-01-01开始
  • C元素是从1900年开始的世纪。
    如果年份为1950年,C部分将为0
    如果是2000年,C部分将是1(并且每100年增加一次)
  • DDD元素反映了从项目开始算起的天数 因此,2月28日将是5月8日
这应该可以:

DECLARE @date DATETIME;
SET @date = '2014-2-15';
SELECT @date,
       YEAR(@date),
       DATEPART(DAYOFYEAR, @date),
       (YEAR(@date) - 1900) * 1000 + DATEPART(DAYOFYEAR, @date) JulianDate;
(因为这是谷歌排名最高的结果)
如果需要将其转换为SSIS包中的表达式语句,可以使用

(DT_WSTR, 50)(((YEAR(GETDATE())-1900)*1000)+DATEPART("dy", GETDATE()))
例如:

"SELECT somefield FROM " + @[User::FileHeaderTable] + " WHERE JdeDate = "+ (DT_WSTR, 50)(((YEAR(GETDATE())-1900)*1000)+DATEPART("dy", GETDATE()))

利用这里的已知值是我个人使用过的两个解决方案,我首先在NodeJS中使用了它们,然后在尝试获取Julian微秒时将它们转换为MSSQL

我有一个已知的格里高利和朱利安微秒的值,所以我只需要将两者转换成桥,并在过程中用作支票。我用这个答案来回答这个问题

/* Known Values:
   Gregorian: 2021-03-03 21:55:00.000
   Julian; 2459277.41319 ) 
   JulianMicrosecond: 212481593700000000
*/
我用了这个密码

然后我将其映射到MSSQL中,我必须以不同的方式处理,注意我必须在上面的公式中输入所有整数值作为浮点数,否则我必须强制转换每个结果。。以浮动的形式输入它们更容易。。如果我不这样做,我只会得到整数结果,它会把结果扔到后面几年

这无疑是一个过于冗长的分解,但它允许您查看过程中的步骤

DECLARE @date DATETIME;

SET @date = '2021-03-03 21:55:00.000';
SELECT @date,
       YEAR(@date) as Year,
       DATEPART(MONTH,@date) as Month,
       DATEPART(DAY,@date) as Day,
       DATEPART(DAYOFYEAR, @date) as DofY,
       14 -(DATEPART(MONTH, @date)) as mm,
       ((14.0 -(DATEPART(MONTH, @date))) / 12.0) as A,
       (YEAR(@date) + 4800.0 - ((14.0 -(DATEPART(MONTH, @date))) / 12.0)) as Y,
       ( DATEPART(MONTH,@date) + (12.0 * ((14.0 -(DATEPART(MONTH, @date))) / 12.0)) -3.0) as M,
       /* Watch the order of operations/parethesis! */
       (DATEPART(DAY,@date) + 
       ((153.0 * (( DATEPART(MONTH,@date) + (12.0 * ((14.0 -(DATEPART(MONTH, @date))) / 12.0)) -3.0)) + 2.0) / 5.0) + 
       (365.0 * ((YEAR(@date) + 4800.0 - ((14.0 -(DATEPART(MONTH, @date))) / 12.0)))) +
       ((YEAR(@date) + 4800.0 - ((14.0 -(DATEPART(MONTH, @date))) / 12.0)) / 4.0) -
       ((YEAR(@date) + 4800.0 - ((14.0 -(DATEPART(MONTH, @date))) / 12.0)) / 100.0) +
       ((YEAR(@date) + 4800.0 - ((14.0 -(DATEPART(MONTH, @date))) / 12.0)) / 400.0) -
       32045.0) as JDN,
       (DATEPART(DAY,@date) + 
       ((153.0 * (( DATEPART(MONTH,@date) + (12.0 * ((14.0 -(DATEPART(MONTH, @date))) / 12.0)) -3.0)) + 2.0) / 5.0) + 
       (365.0 * ((YEAR(@date) + 4800.0 - ((14.0 -(DATEPART(MONTH, @date))) / 12.0)))) +
       ((YEAR(@date) + 4800.0 - ((14.0 -(DATEPART(MONTH, @date))) / 12.0)) / 4.0) -
       ((YEAR(@date) + 4800.0 - ((14.0 -(DATEPART(MONTH, @date))) / 12.0)) / 100.0) +
       ((YEAR(@date) + 4800.0 - ((14.0 -(DATEPART(MONTH, @date))) / 12.0)) / 400.0) -
       32045.0) * 24 * 60 * 60 * 1000000 as JDNMicroSecond,
       /* What others proposed which I do not believe is correct. */
       (YEAR(@date) - 1900) * 1000 + DATEPART(DAYOFYEAR, @date) IncorrectJDN;
输出为:

let getJulainDay = (Year,Month,Day) => {
  a = parseInt((14 - Month) / 12);
  y = Year + 4800 - a;
  m = Month + 12 * a - 3;
  JDN =
    (Day +
    parseInt(
      ( 
      (153 * m + 2) / 5) +
      (365 * y) +
      parseInt(y / 4) -
      parseInt(y / 100) +
      parseInt(y / 400) -
      32045 )
    ) 
   //Into  Julian Microseconds 24*60*60*1e6 
    * 24 * 60 * 60 * 1000000; 
  return JDNMicroSeconds;
};
DECLARE @date DATETIME;

SET @date = '2021-03-03 21:55:00.000';
SELECT @date,
       YEAR(@date) as Year,
       DATEPART(MONTH,@date) as Month,
       DATEPART(DAY,@date) as Day,
       DATEPART(DAYOFYEAR, @date) as DofY,
       14 -(DATEPART(MONTH, @date)) as mm,
       ((14.0 -(DATEPART(MONTH, @date))) / 12.0) as A,
       (YEAR(@date) + 4800.0 - ((14.0 -(DATEPART(MONTH, @date))) / 12.0)) as Y,
       ( DATEPART(MONTH,@date) + (12.0 * ((14.0 -(DATEPART(MONTH, @date))) / 12.0)) -3.0) as M,
       /* Watch the order of operations/parethesis! */
       (DATEPART(DAY,@date) + 
       ((153.0 * (( DATEPART(MONTH,@date) + (12.0 * ((14.0 -(DATEPART(MONTH, @date))) / 12.0)) -3.0)) + 2.0) / 5.0) + 
       (365.0 * ((YEAR(@date) + 4800.0 - ((14.0 -(DATEPART(MONTH, @date))) / 12.0)))) +
       ((YEAR(@date) + 4800.0 - ((14.0 -(DATEPART(MONTH, @date))) / 12.0)) / 4.0) -
       ((YEAR(@date) + 4800.0 - ((14.0 -(DATEPART(MONTH, @date))) / 12.0)) / 100.0) +
       ((YEAR(@date) + 4800.0 - ((14.0 -(DATEPART(MONTH, @date))) / 12.0)) / 400.0) -
       32045.0) as JDN,
       (DATEPART(DAY,@date) + 
       ((153.0 * (( DATEPART(MONTH,@date) + (12.0 * ((14.0 -(DATEPART(MONTH, @date))) / 12.0)) -3.0)) + 2.0) / 5.0) + 
       (365.0 * ((YEAR(@date) + 4800.0 - ((14.0 -(DATEPART(MONTH, @date))) / 12.0)))) +
       ((YEAR(@date) + 4800.0 - ((14.0 -(DATEPART(MONTH, @date))) / 12.0)) / 4.0) -
       ((YEAR(@date) + 4800.0 - ((14.0 -(DATEPART(MONTH, @date))) / 12.0)) / 100.0) +
       ((YEAR(@date) + 4800.0 - ((14.0 -(DATEPART(MONTH, @date))) / 12.0)) / 400.0) -
       32045.0) * 24 * 60 * 60 * 1000000 as JDNMicroSecond,
       /* What others proposed which I do not believe is correct. */
       (YEAR(@date) - 1900) * 1000 + DATEPART(DAYOFYEAR, @date) IncorrectJDN;