约会舍入

der*_*hen 9 t-sql sql-server

我在SQL Server中有一个db表,它包含项目的开始日期.

在Web状态页面上,我想显示项目运行的天数/周/月,单位取决于持续时间.因此,在21天内,我会显示几天,在7周内我会显示几周,否则显示已完成的几个月.所以我得到了几天,几周和几个月的值,然后可以使用一些代码来决定要显示哪一个.

假设该项目于2010年12月30日开始,我今天正在检查(2011年2月27日).

select datediff(d,'30 Dec 2010',getdate()) as days, 
datediff(wk,'30 Dec 2010',getdate()) as weeks , 
datediff(m,'30 Dec 2010',getdate())as months
Run Code Online (Sandbox Code Playgroud)

产生

days: 59    weeks: 9    months: 2
Run Code Online (Sandbox Code Playgroud)

但实际上差异是整整八周,并且会发生一些四舍五入.

我也试过在ASP中做到这一点,得到开始日期然后做日期()但它没有更好.

有没有更好的办法?

谢谢

gbn*_*gbn 13

DATEDIFF使用日期部分的边界.因此,对于"日",今天23:59是明天00:01之前的一整天.

这些类型的计算最好使用相同的单位完成.

;WITH cDayDiff AS
(
   select datediff(day,'20101230',getdate()) as days
)
SELECT
   days / 7 as weeks, --integer division
   days % 7 as remainingdays
FROM
   cDayDiff
Run Code Online (Sandbox Code Playgroud)

由于每个月都有所不同,因此月份很凶悍 但您可以比较日期数(每月)来更正该值.

SELECT
  datediff(month, '20101230', getdate()) -
     CASE WHEN DATEPART(day, '20101230') > DATEPART(day, getdate()) THEN 1 ELSE 0 END 
 as months
Run Code Online (Sandbox Code Playgroud)