如何将所有行varchar与datetime进行比较,并以年,月,日为单位输出差异

时间:2015-04-02 00:18:51

标签: sql-server-2008-r2

enter image description here

我在SQL Server 2008 R2中有这个数据库模型。

请求

我希望在公司中显示数年,数月,数天的服务,如下图所示。

enter image description here

1 个答案:

答案 0 :(得分:0)

如果你想要确切的数字,这是非常棘手的。多少个月是30天?这取决于那些日子的月份。

但如果我们可以使用近似值,并说一个月总是30天(所以一年等于360)。

SELECT Id, dateStartworking,
( 
  CAST(DATEDIFF(d, dateStartworking, getDate()) / 30 / 12 AS varchar) + ' years ' +
  CAST(DATEDIFF(d, dateStartworking, getDate()) / 30 % 12 AS varchar) + ' months ' +
  CAST(DATEDIFF(d, dateStartworking, getDate()) % 30 AS varchar) + ' days'
) 
AS [Years of service] FROM MyData

SQL服务器应该确定dateStartWorking是一个有效的日期,但如果它没有,你可能也想尝试投射它:

CAST(dateStartWorking AS DateTime)

结果:

Id  Datestartworking    Diff
-----------------------------------------------------------
1   20150203            0 years, 1 months, 28 days
2   20150305            0 years, 0 months, 28 days
3   20140115            1 years, 2 months, 22 days

我发现你必须在计算中使用一些近似值,因为1996-07-08和2015-04-02之间的差异报告为19年2个月24天。用上面的脚本,这将是:19年0个月2天。

如果我没有弄错,那意味着我的例子更准确,因为"实际"差异将是18年~9个月。

编辑,以获得更好的精确度:

为了更加精确,您可以使用year = 365.242199 daysmonth = 30.4368499 days

SELECT Id, dateStartworking,
( 
   CAST(CAST(ROUND(DATEDIFF(d, dateStartworking, getDate()) / 365.242199, 0, 1) AS int) AS varchar) + ' years ' +
   CAST(CAST(ROUND(DATEDIFF(d, dateStartworking, getDate()) / 30.4368499, 0, 1) AS int) % 12 AS varchar) + ' months ' +
   CAST(CAST(ROUND(DATEDIFF(d, dateStartworking, getDate()) % 30.4368499, 0 ,1) AS int) AS varchar) + ' days'
) 
AS [Years of service] FROM MyData

这会将上述差异(1996-07-08)报告为18 years 8 months 24 days。足够近了!