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

时间:2013-08-27 20:42:14

标签: sql sql-server datetime sql-server-2008-r2

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

SELECT DATEADD(DAY, -(DATEPART(DAY,GETDATE())-1), GETDATE()) as First_Of_Month;

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

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

使用datepart我计算了号码。天数(int)介于1和今天之间(27-1 = 26) 然后使用dateadd函数,我添加了“-datepart”来获得本月的第一个。

这只是改变日期,我应该看什么或阅读以改变时间。我假设它与19000101

有关

6 个答案:

答案 0 :(得分: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);

对于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));

对于SQL Server 2005

SELECT DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()),0);

如果您正在使用此SQL Server 2005方法,则需要注意:在查询中使用涉及DATEDIFF的表达式时需要注意。 SQL Server can transpose the arguments and lead to horrible estimates - as seen here。采用效率稍低的字符串方法实际上可能更安全:

SELECT CONVERT(DATETIME, CONVERT(CHAR(6), GETDATE(), 112) + '01');

答案 1 :(得分:1)

SELECT convert(varchar(10),DATEADD(DAY, - (DATEPART(DAY,GETDATE())-1), GETDATE()),120)+' 00:00:00' as First_Of_Month;

答案 2 :(得分:1)

只是日期

DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0)

所以一个月它是:

DATEADD(mm, DATEDIFF(mm, 0,  GETDATE()), 0) AS FirstDatetimeOfMonthmm,

答案 3 :(得分:1)

SELECT DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0) as First_Of_Month;

答案 4 :(得分:1)

我认为最简单的方法是将结果投射到日期:

SELECT cast(DATEADD(DAY, -(DATEPART(DAY,GETDATE())-1), GETDATE()) as date) as First_Of_Month

答案 5 :(得分:1)

另一种选择:

SELECT cast(
    cast(datepart(yyyy, getdate()) as varchar)
  + '-'
  + cast(datepart(mm, getdate()) as varchar) + '-01 00:00:00'
as datetime)

从年/月组成部分构建日期,然后在1日和午夜进行修改。