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