3

我有一个时间存储为分数年,例如。1994.232424。我需要将这些转换为 SQL 日期时间。

诀窍是小数年是根据闰年的不同天数计算的。

我很欣赏如何写下将其转换为日期的 SQL 表达式的一个很好的例子,包括闰年条件?自年初以来,我至少需要几秒钟。

闰年条件(虽然在 mssql 中 - 我需要 MySQL 选项)将是(根据http://www.c-sharpcorner.com/blogs/8381/leap-year-logics-in-sql-server.aspx

SET @year = 2012
IF (((@year % 4 = 0) AND (@year % 100 != 0)) OR (@year % 400 = 0))
PRINT '1'
ELSE
print '0'
4

1 回答 1

2

如果我正确理解你的问题,我的想法是计算明年第一天和当年第一天之间的秒数:

SELECT UNIX_TIMESTAMP(MAKEDATE(1994+1,1)) - UNIX_TIMESTAMP(MAKEDATE(1994,1))

然后将此数字乘以给定日期的小数部分:

SELECT (UNIX_TIMESTAMP(MAKEDATE(1994+1,1)) - UNIX_TIMESTAMP(MAKEDATE(1994,1))) * 0.232424

这给出了自年初以来的秒数。然后,您可以将此秒数添加到一年的第一天:

SELECT
  MAKEDATE(1994,1)
  + INTERVAL (UNIX_TIMESTAMP(MAKEDATE(1994+1,1))
             - UNIX_TIMESTAMP(MAKEDATE(1994,1))) * 0.232424 SECOND;

这是一个通用查询:

SET @yourdate = 1994.232424;

SELECT
  MAKEDATE(TRUNCATE(@yourdate, 0),1)
  + INTERVAL (UNIX_TIMESTAMP(MAKEDATE(TRUNCATE(@yourdate, 0)+1,1))
             - UNIX_TIMESTAMP(MAKEDATE(TRUNCATE(@yourdate, 0),1))) *
             (@yourdate-TRUNCATE(@yourdate, 0)) SECOND;

编辑

我想使用 UNIX_TIMESTAMP 因为我不想计算一年是否是闰年,我只想让 MySql 自动计算它。但还有其他选择。

如果年份是闰年,则一年中的秒数是 31536000 + 86400 多。

另一个想法是使用MAKEDATE(year, 60), 查看返回的日期是三月还是二月。MAKEDATE(TRUNCATE(@yourdate, 0),60)=2闰年将被评估为 TRUE (=1),否则为 FALSE (=0):

SELECT
  MAKEDATE(TRUNCATE(@yourdate, 0),1)
  + INTERVAL (31536000 + (MAKEDATE(TRUNCATE(@yourdate, 0),60)=2)*(86400)) *
             (@yourdate-TRUNCATE(@yourdate, 0)) SECOND;

但当然你可以使用你的公式:

(31536000 + (((@year % 4 = 0) AND (@year % 100 != 0)) OR (@year % 400 = 0))*86400)

计算一年中的秒数,然后将此结果乘以小数部分。

于 2013-03-31T15:18:35.947 回答