我写了一个查询以获得第一个月,
SELECT DATEADD(DAY, -(DATEPART(DAY,GETDATE())-1), GETDATE()) as First_Of_Month;
我得到了合适的输出,但我的时间戳显示了当前时间。
这是我在查询中所做的事情,希望我有意义。
使用datepart
我计算了号码。天数(int)介于1和今天之间(27-1 = 26)
然后使用dateadd
函数,我添加了“-datepart”来获得本月的第一个。
这只是改变日期,我应该看什么或阅读以改变时间。我假设它与19000101
有关答案 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日和午夜进行修改。