如何在日期时间00:00:00获得第一个月?

Tan*_*yDB 2 sql sql-server datetime sql-server-2008-r2

我写了一个查询获得第一个月,

SELECT DATEADD(DAY, -(DATEPART(DAY,GETDATE())-1), GETDATE()) as First_Of_Month;
Run Code Online (Sandbox Code Playgroud)

我得到了适当的输出,但我的时间戳显示了当前时间.

这是我在查询中所做的事情,希望我有意义.

datepart我计算了没有.在第1天和今天之间的天(int)(27-1 = 26)然后使用dateadd函数,我添加了"-datepart"以获得该月的第一天.

这只是改变日期,我应该看什么或读什么来改变时间.我假设它与19000101有关

Aar*_*and 5

对于SQL Server 2012(感谢adrift和i-one)

DECLARE @now DATETIME = CURRENT_TIMESTAMP;

SELECT DATEADD(DAY, 1, EOMONTH(@now, -1));

-- or

SELECT DATEFROMPARTS(YEAR(@now), MONTH(@now), 1);
Run Code Online (Sandbox Code Playgroud)

对于SQL Server 2008+

DECLARE @now DATETIME = CURRENT_TIMESTAMP;

-- This shorthand works:

SELECT CONVERT(DATE, @now+1-DAY(@now));

-- But I prefer to be more explicit, instead of relying on
-- shorthand date math (which doesn't work in all scenarios):

SELECT CONVERT(DATE, DATEADD(DAY, 1-DAY(@now), @now));
Run Code Online (Sandbox Code Playgroud)

对于SQL Server 2005

SELECT DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()),0);
Run Code Online (Sandbox Code Playgroud)

如果您使用此SQL Server 2005方法,则需要注意:您需要注意使用涉及DATEDIFF查询的表达式.SQL Server可以转换参数并导致可怕的估计 - 如此处所示.采用效率稍低的字符串方法实际上可能更安全:

SELECT CONVERT(DATETIME, CONVERT(CHAR(6), GETDATE(), 112) + '01');
Run Code Online (Sandbox Code Playgroud)