我正在尝试使用T-SQL函数DATEDIFF
来选择一段时间内不同日期的数量。
以下查询:
SELECT DATEDIFF(DAY, '2012-01-01 01:23:45', '2012-01-02 01:23:45')
选择1
,这比我想要的少一个。该范围内有两个不同的日期:2012-01-01和2012-01-02。
在一般情况下向结果添加一个是不正确的。以下查询:
SELECT DATEDIFF(DAY, '2012-01-01 00:00:00', '2012-01-02 00:00:00')
选择1
,这是正确的,因为范围内只有一个不同的日期。
我确信有一个简单的算术运算我想要计算它。有人能帮助我吗?
答案 0 :(得分:1)
SELECT DATEDIFF(DAY, '2012-01-01 01:23:45', '2012-01-02 01:23:45')
在这个例子中,它应该仍然是1
,因为只有一天过去了。即使您正在考虑一天的开始,它仍然只有一个(因为此范围仅包括2012-01-02 00:00:00
的开头)。
你的逻辑:
SELECT DATEDIFF(DAY, '2012-01-01 01:23:45', '2012-01-02 01:23:45')
和
SELECT DATEDIFF(DAY, '2012-01-01 00:00:00', '2012-01-02 00:00:00')
应该是相同的,在数学上它们是相同的范围。 DATEDIFF
根据第一个参数的粒度进行比较。您按day
进行比较,因此SQL Server会将2012-01-01
与2012-01-02
视为1
天差异。
非常丑陋(在我看来,不好)的解决方法是这样的:
SELECT DATEDIFF(day, yourStartDate, dateadd(ss, -1, yourEndDate)) + 1
这样做可以处理包容性日期。所以你基本上可以这样:
SELECT DATEDIFF(DAY, '2012-01-01 01:23:45', dateadd(ss, -1, '2012-01-02 01:23:45')) + 1
等于2
和此:
SELECT DATEDIFF(DAY, '2012-01-01 00:00:00', dateadd(ss, -1, '2012-01-02 00:00:00')) + 1
等于1
。我不认为这是世界上最好的主意,但它会给你你想要的输出。这一切都归结为商业逻辑。