我在SQL Server 2008 R2中有这个数据库模型。
请求
我希望在公司中显示数年,数月,数天的服务,如下图所示。
答案 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 days
和month = 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
。足够近了!