- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在阅读本主题并被建议使用 DateDiff
之后。我写了一个没有提供我想要的答案的函数。客户现在想知道完成 list 需要多长时间。我有一个 CreationDate
和 CompletionDate
。我需要知道这花了多少年、几个月、几周和几天。如果是 2 天,则没有年份的“2 天”。该函数减去年数,然后尝试检查月数,然后是周数,然后是天数。仅在可用时给出结果。看来 DateDiff
是问题...或者我是不理解 DateDiff
的问题。它甚至返回一个星期,日期相差 4 天,这是没有意义的。它应该返回两个日期内的周数,而不关心它何时开始。
这是代码
ALTER FUNCTION [dbo].[DateRangeText]
(@FromDate DATETIME, @ToDate DATETIME)
RETURNS VARCHAR(MAX)
AS
BEGIN
DECLARE @Result AS VARCHAR(MAX);
SET @Result = '';
DECLARE @TmpS AS VARCHAR(MAX);
SET @TmpS = '';
DECLARE @Years AS INT;
SET @Years = DATEDIFF(year, @FromDate, @ToDate);
IF (@Years > 0)
BEGIN
IF (@Years = 1)
SET @TmpS = ' Year ';
ELSE
SET @TmpS = ' Years ';
SET @Result = @Result + CAST(@Years AS VARCHAR) + @TmpS;
SET @ToDate = DATEADD(YEAR, -1 * @Years, @ToDate);
END;
DECLARE @Months AS INT;
SET @Months = DATEDIFF(month, @FromDate, @ToDate);
IF (@Months > 0)
BEGIN
IF (@Months = 1)
SET @TmpS = ' Month ';
ELSE
SET @TmpS = ' Months ';
SET @Result = @Result + CAST(@Months AS VARCHAR) + @TmpS;
SET @ToDate = DATEADD(MONTH, -1 * @Months, @ToDate);
END;
DECLARE @Weeks AS INT;
SET @Weeks = DATEDIFF(week, @FromDate, @ToDate);
IF (@Weeks > 0)
BEGIN
IF (@Weeks = 1)
SET @TmpS = ' Week ';
ELSE
SET @TmpS = ' Weeks ';
SET @Result = @Result + CAST(@Weeks AS VARCHAR) + @TmpS;
SET @ToDate = DATEADD(WEEK, -1 * @Weeks, @ToDate);
END;
DECLARE @Days AS INT;
SET @Days = DATEDIFF(day, @FromDate, @ToDate);
IF (@Days > 0)
BEGIN
IF (@Days = 1)
SET @TmpS = ' Day ';
ELSE
SET @TmpS = ' Days ';
SET @Result = @Result + CAST(@Days AS VARCHAR) + @TmpS;
SET @ToDate = DATEADD(WEEK, -1 * @Days, @ToDate);
END;
IF (@Result = '')
SET @Result = 'Same day';
RETURN Rtrim(COALESCE(@Result,''));
END;
最佳答案
由于您使用的是函数,请考虑以下表值函数。易于独立使用或作为交叉应用包含在内。
高性能且准确,无需担心所有杂项日期计算。
示例
Select * from [dbo].[tvf-Date-Elapsed] ('1991-09-12 21:00:00.000',GetDate())
返回
Years Months Days Hours Minutes Seconds
26 7 5 13 47 11
TVF(如果有兴趣)
CREATE FUNCTION [dbo].[tvf-Date-Elapsed] (@D1 DateTime,@D2 DateTime)
Returns Table
Return (
with cteBN(N) as (Select 1 From (Values(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) N(N)),
cteRN(R) as (Select Row_Number() Over (Order By (Select NULL))-1 From cteBN a,cteBN b,cteBN c),
cteYY(N,D) as (Select Max(R),Max(DateAdd(YY,R,@D1))From cteRN R Where DateAdd(YY,R,@D1)<=@D2),
cteMM(N,D) as (Select Max(R),Max(DateAdd(MM,R,D)) From (Select Top 12 R From cteRN Order By 1) R, cteYY P Where DateAdd(MM,R,D)<=@D2),
cteDD(N,D) as (Select Max(R),Max(DateAdd(DD,R,D)) From (Select Top 31 R From cteRN Order By 1) R, cteMM P Where DateAdd(DD,R,D)<=@D2),
cteHH(N,D) as (Select Max(R),Max(DateAdd(HH,R,D)) From (Select Top 24 R From cteRN Order By 1) R, cteDD P Where DateAdd(HH,R,D)<=@D2),
cteMI(N,D) as (Select Max(R),Max(DateAdd(MI,R,D)) From (Select Top 60 R From cteRN Order By 1) R, cteHH P Where DateAdd(MI,R,D)<=@D2),
cteSS(N,D) as (Select Max(R),Max(DateAdd(SS,R,D)) From (Select Top 60 R From cteRN Order By 1) R, cteMI P Where DateAdd(SS,R,D)<=@D2)
Select [Years] = cteYY.N
,[Months] = cteMM.N
,[Days] = cteDD.N
,[Hours] = cteHH.N
,[Minutes] = cteMI.N
,[Seconds] = cteSS.N
--,[Elapsed] = Format(cteYY.N,'0000')+':'+Format(cteMM.N,'00')+':'+Format(cteDD.N,'00')+' '+Format(cteHH.N,'00')+':'+Format(cteMI.N,'00')+':'+Format(cteSS.N,'00')
From cteYY,cteMM,cteDD,cteHH,cteMI,cteSS
)
--Max 1000 years
--Select * from [dbo].[tvf-Date-Elapsed] ('1991-09-12 21:00:00.000',GetDate())
--Select * from [dbo].[tvf-Date-Elapsed] ('2017-01-01 20:30:15','2018-02-05 22:58:35')
关于SQL Server : determining the Years, 两个日期之间的月、周和天,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49903501/
我需要本地化所有可能性: 1年, 2 年,然后……(不超过任何数字)。 1个月, 2 个月,然后……(不超过任何数字)。 在各种语言中,“年”这个词会根据它前面的数字而变化。比如法语: 22 年 =
本文整理了Java中org.joda.time.Years.years()方法的一些代码示例,展示了Years.years()的具体用法。这些代码示例主要来源于Github/Stackoverflow
年.hs: year = year + 1 main = print year 这不是尾递归调用: year = year + 1 year = (year + 1) + 1 year = ((yea
我有一个表,其中包含来自流量计的数据,排列如下: Water.Year May Jun Jul Aug Sep Oct Nov Dec Jan Feb
本文整理了Java中com.meidusa.amoeba.sqljep.function.Year.year()方法的一些代码示例,展示了Year.year()的具体用法。这些代码示例主要来源于Git
我是 Java 新手,希望获得一些有关正在尝试解决的问题的建议。我必须编写一个方法来生成唯一的编号。 因此,以字符串表示的唯一数字将有 10 个字符。 #1. First 2 will represe
谁有权威的答案,哪个性能更好? GROUP BY YEAR(FROM_UNIXTIME(col)) /* or */ GROUP BY EXTRACT(YEAR FROM FROM_U
我从今年过去了 20 年。但目前我希望它显示为年复一年。例如:1992 - 1999 1999 - 2002 2003 - 2015 这是我的代码。 function populatedropdown
我目前能够将 Landsat 图像拆分为 LC80440142014093LGN00.tar.gz 的日期信息, 我把它分成 2014093 .现在我需要将其更改为 Excel 或 Open Offi
我有一些数据想总结一下。我想对所有列进行总结,固定 YEAR 列。即对于一个变量我可以做: df %>% group_by(LG1, YEAR) %>% summarise(Freq = n(
我有一个独特的问题,我根本无法解决。 所以我在 SQL Server 2005 中,我得到了以下要处理的数据: FISCAL_YEAR_START_MONTH INT(财政年度的第一个月) COUNT
我有一些数据想总结一下。我想对所有列进行总结,固定 YEAR 列。即对于一个变量我可以做: df %>% group_by(LG1, YEAR) %>% summarise(Freq = n(
我想从指定年份的表中获取所有数据。但问题是我将日期设置为 DATETIME 类型。 我正在尝试类似的东西: SELECT * FROM table WHERE entrytim
使用日期选择器,年份下拉菜单默认只显示 10 年。用户必须单击最后一年才能添加更多年份。 我们如何将初始范围设置为 100 年,以便用户默认看到一个大列表? function InitDate
我必须将我的数据帧从当前格式转换为新格式(请参阅下面的图像或结构)。我不知道如何才能做到这一点。我想要每个 ID 一年,从 2013 年到 2018 年(所以每个 ID 有 6 行,每年一个)。日期是
在学习了 Hadley 的书并在 SO 上搜索之后,我创建了一个由年和月矩阵组成的热图,颜色根据时间序列变量的百分比变化而变化。热图和我用来获取它的代码如下所示。我还有一些我自己无法解决的问题。 1)
在电子表格上,我有各种谷歌分析 channel (有机、直接、移动、桌面等)的月度报告表。对于每个 channel ,我都有另一列自动计算 Y-o-Y EX 的增长百分比:(A12-A1)/A1。然后
我有几个气象变量的时间序列数据集。时间数据记录在三个单独的列中: 年份(例如 2012) 一年中的第几天(例如 261 代表闰年的 9 月 17 日) 时:分(例如 1610) 有没有一种方法可以合并
YEAR(x) 和 EXTRACT(YEAR FROM x) 在 MySQL 中是否等价? 似乎在我所有的实验中都有,但我不确定是否没有任何边缘情况。 举个例子:这两个查询返回完全相同的结果。但我不确
我读到“将日期字符串转换为mysql日期时间字段”:但这对我没有帮助 所以我想做的是将dat文件读入mysql中的空表。 table CLIMBED(TRIP_ID int,PEAK VARCHAR(
我是一名优秀的程序员,十分优秀!