【问题标题】:Date Functions Conversions in SQLSQL 中的日期函数转换
【发布时间】:2017-11-10 04:06:49
【问题描述】:

有没有办法使用 TSQL 将整数转换为年月日

例如365 转换为 1 年 0 个月和 0 天 366 转换为 1 年 0 个月零 1 天

20 转换为 0 年 0 个月和 20 天 200 转换为 0 年 13 个月和 9 天 408 转换为 1 年 3 个月零 7 天 .. 等等

【问题讨论】:

  • 这实际上是 sql-server-2008 吗?确切的版本很重要
  • 类似:select cast( as datetime)
  • 我相信,sql-server中没有内置函数,但你可以通过数学计算找到它。
  • 嗨,是的,它在 Sql Server 2008R2 中
  • “408转1年3个月7天”的逻辑是什么?答案不会是一个常数,因为并非所有月(或年)的长度都相同。这永远不会是正确的答案,因为它比正常年份只有 43 天。

标签: sql sql-server sql-server-2008-r2


【解决方案1】:

我不知道 SQL Server 2008 中的任何内置方式,但以下逻辑将为您提供将项目连接在一起所需的所有部分:

select
     n
   , year(dateadd(day,n,0))-1900 y
   , month(dateadd(day,n,0))-1 m
   , day(dateadd(day,n,0))-1 d
from (
    select 365 n union all
    select 366 n union all
    select 20 n union all
    select 200 n union all
    select 408 n
    ) d

| n     | y | m | d  |
|-------|---|---|----|
| 365   | 1 | 0 |  0 |
| 366   | 1 | 0 |  1 |
|  20   | 0 | 0 | 20 |
| 200   | 0 | 6 | 19 |
| 408   | 1 | 1 | 12 |

请注意,DATEDADD 函数中使用的零是日期 1900-01-01,因此从年份计算中减去 1900。

感谢 Martin Smith 纠正了我对闰年的假设。

【讨论】:

  • 嗨,感谢您的评论,但真的不想硬编码它有没有其他方法可以实现这一目标。??
  • Hardcode?...你不喜欢 4 个常量?(它们真的不会改变)。准确的日期单位算术并非易事,内置的 dateadd 函数可为您提供快速准确的结果。
  • @MartinSmith 谢谢,我已经更正了,应该允许在 dateadd 中使用零,我稍后再试。
  • 此答案已更改为使用“零日期”(1900-01-01),它也删除了字符串常量,改为使用零。
  • 您的问题现在解决了吗?你对这个答案还有疑问吗?要接受答案“Click the Tick”了解更多信息,请参阅help/accepting
【解决方案2】:

如果我们认为所有 months 都是 30 days,您可以尝试不使用任何函数,只需将 integer 值相除:

DECLARE @days INT;
SET @days = 365;

SELECT [Years] = @days / 365,
       [Months] = (@days % 365) / 30,
       [Days] = (@days % 365) % 30;

@days = 365

Years   Months  Days
1       0       0

@days = 20

Years   Months  Days
0       0       20

【讨论】:

  • 嗨,Yogesh,让我尝试更新您的信息。谢谢您的评论!!
猜你喜欢
  • 2021-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-08
  • 2013-11-18
相关资源
最近更新 更多