【问题标题】:What is happening in this query?这个查询发生了什么?
【发布时间】:2013-08-27 16:19:37
【问题描述】:

我正在尝试获取最后一个月的数据,为此我编写了以下内容来计算编号。从今天到最后一天的天数。

    select datediff(DAY,GETDATE(),dateadd(m,1,getdate()))-GETDATE()

粗体部分给了我没有。从今天到一个月后的天数,比如 30 或 31。然后我从 30 或 31 中减去今天的日期,即“-getdate()”

上述查询的输出是

1786-06-06 11:44:30.540

您能否解释一下查询中发生了什么?我不是在寻找解决方案,我想知道 SQL-Server 是如何解释查询的。

谢谢。 :)

【问题讨论】:

  • 比较“select 30 - GETDATE()”和“select 31 - GETDATE()”的输出。我猜它以某种方式将 30 / 31 转换为日期,看看两者之间的差异应该如何显示

标签: sql sql-server


【解决方案1】:

表达式的粗体部分不返回日期,它返回天数:

31

将其转换为日期时间:

SELECT CONVERT(DATETIME, 31);

这是 31 天后 第 0 天 (1900-01-01):

1900-02-01

现在,将GETDATE() 减去一个整数(41512 第 0 天后):

SELECT 31 - 41512 = -41481

现在将 -41481 天添加到第 0 天:

SELECT DATEADD(DAY, -41481, 0);
-- or
SELECT DATEADD(DAY, -41481, '19000101');

或者:

SELECT CONVERT(DATETIME, 31 - CONVERT(INT, GETDATE()));

现在,我强烈推荐几件事:

  1. 不要使用隐式日期数学。例如,@date_var_or_col - 1 会因 DATEDATETIME2 等新数据类型而失败。
  2. 不要使用像m 这样的简写。如果您的意思是MONTH,只需承受巨大的生产力冲击并输入MONTH。要了解原因,请告诉我这是否提供了您期望的结果:

    SELECT DATEPART(y, GETDATE()), DATEPART(w, GETDATE());
    

【讨论】:

  • 感谢亚伦的意见。猜猜我需要重新考虑如何编写其余的查询。但是现在你能不能看看这个,如果正确,请告诉我。我确实得到了正确的输出,但这适用于整个日历吗? - 得到最后一个月。选择 DATEADD(DAY, DATEDIFF(DAY,GETDATE(),DATEADD(MONTH,1,GETDATE()))-(DATEPART(DD,GETDATE())), GETDATE()) 作为 Last_Of_Month;
  • @TanmoyDB 首先你能解释一下为什么你需要一个月的最后一天吗?对于大多数报告查询,您希望 >= 月初和
  • 我是 SQL 新手,正在尝试为自己编写查询。所以我试着自己写而不是在网上搜索。
  • 我明白了,但是了解您在本月的最后一天需要做什么可以帮助我指导您。你确实请求过帮助,对吧? :-)
  • 是的,我需要我能得到的所有帮助。我遇到了一个帖子,其中有 First of, week, next week, month, next/previous 等。所以我自己尝试一些其他的变化。
【解决方案2】:

我从 30 或 31 中减去今天的日期,即“-getdate()”

听起来您完全了解正在发生的事情,但可能不了解结果。

您正在将GETDATE() 隐式转换为一个数字,该数字表示自1/1/1900 12:00:00 AM 以来的天数(和小数天数)

当您从 3031“减去”GETDATE()(截至 2013 年 8 月 27 日为 41,511)时,您会得到 -41,480 或 41,480 天的答案之前 @987654326 @,大约是 6/6/1786(小数部分加或减几个小时)。

【讨论】:

  • 感谢斯坦利,这有帮助。 :)
猜你喜欢
  • 2021-12-12
  • 1970-01-01
  • 1970-01-01
  • 2010-10-27
  • 1970-01-01
  • 2018-11-12
  • 2017-11-14
相关资源
最近更新 更多