此查询如何工作以获取当月的第一天?

use*_*978 3 sql t-sql sql-server sql-server-2008

SELECT Dateadd(month, Datediff(month, 0, Getdate()), 0),
'First Day of Current Month'
Run Code Online (Sandbox Code Playgroud)

谁能告诉我这个查询如何工作以获得当月的第一天?

小智 5

首先

Datediff(月,0,Getdate())将给出从1900年开始的总月数

从1900年开始,您可以添加上述月份返回的月份,这样您就可以获得一个月的第一个日期

例如:如果我们采取现在的月份

Datediff(月,0,Getdate())= 1349个月

如果您在'1900/01/01'中添加1349个月,您将在本月第一次约会'2012/06/01'


Dam*_*ver 5

DATEADD/DATEDIFF

该模式可用于实现许多不同的效果.一般模式是:

DATEADD(part,DATEDIFF(part,x,z),y)
Run Code Online (Sandbox Code Playgroud)

其中part是日期的相同的构件,x并且y通常是常数,并且z是调整日期.

xy设置为相同的常量时,它具有消除元素z之外的所有组件的效果part,并用相应的组件替换这些组件y.(0被视为相同1900-01-01T00:00:00)

因此,SELECT Dateadd(month, Datediff(month, 0, Getdate()), 0)获取当前日期(z= GetDate()),并将其中的那些部分month(day和所有时间组件)替换为相应的部分1900-01-01T00:00:00.

要获得今天的开始,您将使用:

DATEADD(day,DATEDIFF(day,0,GETDATE()),0)
Run Code Online (Sandbox Code Playgroud)

当这种模式变得更为有趣的是,它可以被用来实现"抵消"的效果时xy不相等.例如,要获得上个月的最后一天,您可以:

DATEADD(month,DATEDIFF(month,'20010101',GETDATE()),'20001231')
Run Code Online (Sandbox Code Playgroud)

在这里,实际值xy无关紧要.重要的是它们之间的关系.