Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何在datetime中获得月初的00:00:00?_Sql_Sql Server_Datetime_Sql Server 2008 R2 - Fatal编程技术网

Sql 如何在datetime中获得月初的00:00:00?

Sql 如何在datetime中获得月初的00:00:00?,sql,sql-server,datetime,sql-server-2008-r2,Sql,Sql Server,Datetime,Sql Server 2008 R2,我写了一个查询以获得月初 SELECT DATEADD(DAY, -(DATEPART(DAY,GETDATE())-1), GETDATE()) as First_Of_Month; 我确实得到了相应的输出,但我的时间戳显示了当前时间 以下是我在查询中所做的,希望有意义 使用dateparti计算了从第一天到今天的天数(int)(27-1=26) 然后,使用dateadd函数,我添加了“-datepart”以获取月份的第一个 这只是更改日期,为了更改时间,我应该看什么或读什么。我假设它与19

我写了一个查询以获得月初

SELECT DATEADD(DAY, -(DATEPART(DAY,GETDATE())-1), GETDATE()) as First_Of_Month;
我确实得到了相应的输出,但我的时间戳显示了当前时间

以下是我在查询中所做的,希望有意义

使用
datepart
i计算了从第一天到今天的天数(int)(27-1=26) 然后,使用
dateadd
函数,我添加了“-datepart”以获取月份的第一个

这只是更改日期,为了更改时间,我应该看什么或读什么。我假设它与19000101有关,只是日期

SELECT convert(varchar(10),DATEADD(DAY, - (DATEPART(DAY,GETDATE())-1), GETDATE()),120)+' 00:00:00' as First_Of_Month;
DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0)
因此,一个月内:

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

我认为最简单的方法是迄今为止的结果:

SELECT cast(DATEADD(DAY, -(DATEPART(DAY,GETDATE())-1), GETDATE()) as date) as First_Of_Month
一个备选方案:

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

根据年/月组件建立日期,然后在1号和午夜进行调整。

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

适用于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
的表达式时要小心。实际上,采用效率稍低的字符串方法可能更安全:

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

感谢Mark以正确的方式对其进行编辑。:)什么版本的SQL Server?还有,你会用这个做什么?@AaronBertrand:我用的是SS-2008R2Great,请总是用一个版本提问,这样人们就不用猜了。答案可能很重要。@AaronBertrand:你的另一个有用的建议。我是新来论坛的,所以请原谅我的愚蠢错误。这取决于它的使用方式。它给了我今天的日期和时间戳00:00:00,谢谢你。:)现在我需要寻找一种方法来做到这一点,这样我才能得到月1号。请不要提倡使用速记。您可能已经记住了M是月份,但是您是否曾经惊讶于,比如,
selectdatepart(Y,GETDATE())
选择DATEPART(W,GETDATE())?输入
MONTH
不需要花很多力气,而且它可以让您的代码自行编制文档。+1,只是为了好玩
DATEADD(DAY,1,EOMONTH(GETDATE(),-1))
2012+?@adrift好的,我会添加它,不过我承认我不是这个函数的超级粉丝
BOMONTH()
会有用得多。让我检查一下我是否正确,1)月初转换为120的格式代码,2)为什么是+'00:00'?这只是为了增加“空间00:00:00”吗?
SELECT DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()),0);
SELECT CONVERT(DATETIME, CONVERT(CHAR(6), GETDATE(), 112) + '01');