SELECT GETDATE()
回报:2008-09-22 15:24:13.790
我想要没有时间部分的日期部分:2008-09-22 00:00:00.000
我怎么能得到那个?
SELECT GETDATE()
回报:2008-09-22 15:24:13.790
我想要没有时间部分的日期部分:2008-09-22 00:00:00.000
我怎么能得到那个?
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, @your_date))
例如
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))
给我
2008-09-22 00:00:00.000
优点:
SQLServer 2008 现在有一个“日期”数据类型,它只包含一个没有时间组件的日期。使用 SQLServer 2008 及更高版本的任何人都可以执行以下操作:
SELECT CONVERT(date, GETDATE())
如果使用 SQL 2008 及更高版本:
select cast(getdate() as date)
DATEADD 和 DATEDIFF 比 CONVERTing to varchar 要好。两个查询具有相同的执行计划,但执行计划主要与数据访问策略有关,并不总是揭示执行所有部分所花费的 CPU 时间所涉及的隐含成本。如果两个查询都针对具有数百万行的表运行,则使用 DateDiff 的 CPU 时间可以接近 Convert CPU 时间的 1/3!
要查看查询的执行计划:
set showplan_text on
GO
DATEADD 和 DATEDIFF 都将执行 CONVERT_IMPLICIT。
尽管 CONVERT 解决方案对某些人来说更简单、更易于阅读,但速度较慢。无需转换回 DateTime(这是由服务器隐式完成的)。之后在 DateDiff 方法中也不需要 DateAdd,因为整数结果也将隐式转换回 DateTime。
从日期表中选择转换(varchar,MyDate,101)
|--Compute Scalar(DEFINE:([Expr1004]=CONVERT(varchar(30),[TEST].[dbo].[DatesTable].[MyDate],101)))
|--Table Scan(OBJECT:([TEST].[dbo].[DatesTable]))
从日期表中选择 DATEADD(dd, 0, DATEDIFF(dd, 0, MyDate))
|--Compute Scalar(DEFINE:([Expr1004]=dateadd(day,(0),CONVERT_IMPLICIT(datetime,datediff(day,'1900-01-01 00:00:00.000',CONVERT_IMPLICIT(datetime,[TEST].[dbo].[DatesTable].[MyDate],0)),0))))
|--Table Scan(OBJECT:([TEST].[dbo].[DatesTable]))
像@digi 建议的那样使用 FLOOR() 具有更接近 DateDiff 的性能,但不建议将 DateTime 数据类型转换为 float 和 back 并不总是产生原始值。
记住伙计们:不要相信任何人。查看性能统计数据,并自行测试!
测试结果时要小心。向客户端选择许多行将隐藏性能差异,因为通过网络发送行所需的时间比执行计算所需的时间长。因此,请确保所有行的工作都由服务器完成,但没有发送到客户端的行集。
有些人似乎对缓存优化何时影响查询感到困惑。在同一批次或不同批次中运行两个查询对缓存没有影响。因此,您可以手动使缓存过期,也可以简单地多次来回运行查询。查询 #2 的任何优化也会影响任何后续查询,因此如果您愿意,请放弃执行 #1。
这是完整的测试脚本和性能结果,证明 DateDiff 比转换为 varchar 快得多。
SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 101))
以日期格式返回
CAST(OrderDate AS 日期)
上面的代码将在 sql server 2010 中工作
它将在 2013 年 12 月 12 日返回
对于 SQL Server 2012,请使用以下代码
CONVERT(VARCHAR(10), OrderDate , 111)
您可以使用该CONVERT
函数仅返回日期。请参阅以下链接:
使用转换函数的语法是:
CONVERT ( data_type [ ( length ) ] , expression [ , style ] )
如果你需要结果作为 a varchar
,你应该通过
SELECT CONVERT(DATE, GETDATE()) --2014-03-26
SELECT CONVERT(VARCHAR(10), GETDATE(), 111) --2014/03/26
上面已经提到过。
如果您需要日期和时间格式的结果,您应该使用以下任何查询
SELECT CONVERT(DATETIME, CONVERT(VARCHAR(10), GETDATE(), 111)) AS OnlyDate
2014-03-26 00:00:00.000
SELECT CONVERT(DATETIME, CONVERT(VARCHAR(10), GETDATE(), 112)) AS OnlyDate
2014-03-26 00:00:00.000
DECLARE @OnlyDate DATETIME
SET @OnlyDate = DATEDIFF(DD, 0, GETDATE())
SELECT @OnlyDate AS OnlyDate
2014-03-26 00:00:00.000
使用Format()
功能。
SQL Server 已经有多种答案和格式类型。但是大多数方法都有些模棱两可,您很难记住与特定日期格式相关的格式类型或函数的数字。这就是为什么在 SQL Server 的下一个版本中有更好的选择。
FORMAT ( value, format [, culture ] )
文化选项非常有用,因为您可以根据观众指定日期。
您必须记住 d(用于小图案)和 D(用于长图案)。
2009-06-15T13:45:30 -> 6/15/2009 (en-US)
2009-06-15T13:45:30 -> 15/06/2009 (fr-FR)
2009-06-15T13:45:30 -> 2009/06/15 (ja-JP)
2009-06-15T13:45:30 -> Monday, June 15, 2009 (en-US)
2009-06-15T13:45:30 -> 15 июня 2009 г. (ru-RU)
2009-06-15T13:45:30 -> Montag, 15. Juni 2009 (de-DE)
查询中的更多示例。
DECLARE @d DATETIME = '10/01/2011';
SELECT FORMAT ( @d, 'd', 'en-US' ) AS 'US English Result'
,FORMAT ( @d, 'd', 'en-gb' ) AS 'Great Britain English Result'
,FORMAT ( @d, 'd', 'de-de' ) AS 'German Result'
,FORMAT ( @d, 'd', 'zh-cn' ) AS 'Simplified Chinese (PRC) Result';
SELECT FORMAT ( @d, 'D', 'en-US' ) AS 'US English Result'
,FORMAT ( @d, 'D', 'en-gb' ) AS 'Great Britain English Result'
,FORMAT ( @d, 'D', 'de-de' ) AS 'German Result'
,FORMAT ( @d, 'D', 'zh-cn' ) AS 'Chinese (Simplified PRC) Result';
US English Result Great Britain English Result German Result Simplified Chinese (PRC) Result
---------------- ----------------------------- ------------- -------------------------------------
10/1/2011 01/10/2011 01.10.2011 2011/10/1
US English Result Great Britain English Result German Result Chinese (Simplified PRC) Result
---------------------------- ----------------------------- ----------------------------- ---------------------------------------
Saturday, October 01, 2011 01 October 2011 Samstag, 1. Oktober 2011 2011年10月1日
如果你想要更多的格式,你可以去:
SELECT CONVERT(VARCHAR,DATEADD(DAY,-1,GETDATE()),103) --21/09/2011
SELECT CONVERT(VARCHAR,DATEADD(DAY,-1,GETDATE()),101) --09/21/2011
SELECT CONVERT(VARCHAR,DATEADD(DAY,-1,GETDATE()),111) --2011/09/21
SELECT CONVERT(VARCHAR,DATEADD(DAY,-1,GETDATE()),107) --Sep 21, 2011
使用 FLOOR() - 只是减少时间部分。
SELECT CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME)
如果您想使用 CONVERT 并获得与提出的原始问题相同的输出,即 yyyy-mm-dd 然后使用CONVERT(varchar(10),[SourceDate as dateTime],121)
与前面几个答案相同的代码,但使用破折号转换为 yyyy-mm-dd 的代码是121.
如果我能在我的肥皂盒上稍等片刻,这种格式不属于数据层,这就是为什么在 SQL Server 2008 之前没有愚蠢的高开销“技巧”是不可能的,当时实际的 datepart 数据类型是介绍了。在数据层进行这样的转换是对 DBMS 开销的巨大浪费,但更重要的是,当您执行此类操作时,您基本上已经创建了内存中的孤立数据,我假设您将返回到程序中。您不能将其放回另一个 3NF+ 列或将其与键入的任何内容进行比较而无需还原,因此您所做的只是引入了故障点并删除了关系引用。
您应该始终将您的 dateTime 数据类型返回给调用程序,并在 PRESENTATION 层中进行必要的调整。一旦你在将它们返回给调用者之前进行转换,你就消除了应用程序中引用完整性的所有希望。这将再次阻止 UPDATE 或 DELETE 操作,除非您进行某种手动还原,否则在不需要时再次将您的数据暴露给人/代码/gremlin 错误。
做就是了:
SELECT CAST(date_variable AS date)
或与 PostgreSQL 一起使用:
SELECT date_variable::date
这称为类型转换顺便说一句!
SELECT DATEADD(DD, DATEDIFF(DD, 0, GETDATE()), 0)
SELECT DATEADD(DAY, 0, DATEDIFF(DAY,0, GETDATE()))
SELECT CONVERT(DATETIME, CONVERT(VARCHAR(10), GETDATE(), 101))
编辑:前两种方法基本相同,并执行转换为 varchar 方法。
为了获得指示的结果,我使用以下命令。
SELECT CONVERT(DATETIME,CONVERT(DATE,GETDATE()))
我希望它很有用。
Convert(nvarchar(10), getdate(), 101) ---> 5/12/14
Convert(nvarchar(12), getdate(), 101) ---> 5/12/2014
如果要将结果分配给列或变量,请为其指定 DATE 类型,并且转换是隐式的。
DECLARE @Date DATE = GETDATE()
SELECT @Date --> 2017-05-03
我认为这适用于您的情况:
CONVERT(VARCHAR(10),Person.DateOfBirth,111) AS BirthDate
//here date is obtained as 1990/09/25
DECLARE @yourdate DATETIME = '11/1/2014 12:25pm'
SELECT CONVERT(DATE, @yourdate)
好的,虽然我有点晚了:),这是另一个解决方案。
SELECT CAST(FLOOR(CAST(GETDATE() AS FLOAT)) as DATETIME)
结果
2008-09-22 00:00:00.000
如果您使用的是 SQL Server 2012 及更高版本,那么您可以使用FORMAT()
这样的功能 -
SELECT FORMAT(GETDATE(), 'yyyy-MM-dd')
日期:
选择转换(日期,GETDATE()) 选择 CAST(GETDATE() 作为日期)
时间:
选择转换(时间,GETDATE(),114) 选择 CAST(GETDATE() 作为时间)
只需您可以这样做:
SELECT CONVERT(date, getdate())
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, @your_date))
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))
输出为:
2008-09-22 00:00:00.000
或者干脆这样做:
SELECT CONVERT (DATE, GETDATE()) 'Date Part Only'
结果:
Date Part Only
--------------
2013-07-14
即使使用古老的 MSSQL Server 7.0,此处的代码(由此链接提供)也允许我获得当时正在寻找的任何日期格式:
PRINT '1) Date/time in format MON DD YYYY HH:MI AM (OR PM): ' + CONVERT(CHAR(19),GETDATE())
PRINT '2) Date/time in format MM-DD-YY: ' + CONVERT(CHAR(8),GETDATE(),10)
PRINT '3) Date/time in format MM-DD-YYYY: ' + CONVERT(CHAR(10),GETDATE(),110)
PRINT '4) Date/time in format DD MON YYYY: ' + CONVERT(CHAR(11),GETDATE(),106)
PRINT '5) Date/time in format DD MON YY: ' + CONVERT(CHAR(9),GETDATE(),6)
PRINT '6) Date/time in format DD MON YYYY HH:MM:SS:MMM(24H): ' + CONVERT(CHAR(24),GETDATE(),113)
它产生了这个输出:
1) Date/time in format MON DD YYYY HH:MI AM (OR PM): Feb 27 2015 1:14PM
2) Date/time in format MM-DD-YY: 02-27-15
3) Date/time in format MM-DD-YYYY: 02-27-2015
4) Date/time in format DD MON YYYY: 27 Feb 2015
5) Date/time in format DD MON YY: 27 Feb 15
6) Date/time in format DD MON YYYY HH:MM:SS:MMM(24H): 27 Feb 2015 13:14:46:630
你为什么不使用 DATE_FORMAT(your_datetiem_column, '%d-%m-%Y') ?
前任:select DATE_FORMAT( some_datetime_column, '%d-%m-%Y' ) from table_name
您可以通过重新排列'%d-%m-%Y'
部分来更改 m、d 和 year 的顺序
我赞成以下未提及的内容:
DATEFROMPARTS(DATEPART(yyyy, @mydatetime), DATEPART(mm, @mydatetime), DATEPART(dd, @mydatetime))
它也不关心本地或进行双重转换——尽管每个“日期部分”可能都会做数学运算。所以它可能比 datediff 方法慢一点,但对我来说它更清楚。特别是当我只想按年和月分组时(将日期设置为 1)。
我知道这是旧的,但我没有看到有人这样说。据我所知,这是 ANSI 标准。
SELECT CAST(CURRENT_TIMESTAMP AS DATE)
如果 Microsoft 也可以支持 ANSI 标准 CURRENT_DATE 变量,那就太好了。
在 SQL Server 2000 上
CAST(
(
STR( YEAR( GETDATE() ) ) + '/' +
STR( MONTH( GETDATE() ) ) + '/' +
STR( DAY( GETDATE() ) )
)
AS DATETIME)
从 SQL SERVER 2012 开始,您可以这样做:
SELECT FORMAT(GETDATE(), 'yyyy-MM-dd 00:00:00.000')
您可以使用以下日期部分和格式化日期:
DATENAME => 返回一个字符串,表示指定日期的指定日期部分
DATEADD => 该DATEPART()
函数用于返回日期/时间的单个部分,例如年、月、日、小时、分钟等。
DATEPART =>返回一个整数,表示指定日期的指定日期部分。
CONVERT()
=> 该CONVERT()
函数是将一种数据类型的表达式转换为另一种数据类型的通用函数。该
CONVERT()
功能可用于以不同格式显示日期/时间数据。
Date(date&time field)和DATE_FORMAT(date&time,'%Y-%m-%d')都只返回 date&time 中的日期
SELECT * FROM tablename WHERE CAST ([my_date_time_var] AS DATE)= '8/5/2015'
句法:
SELECT CONVERT (data_type(length)),Date, DateFormatCode)
前任:
Select CONVERT(varchar,GETDATE(),1) as [MM/DD/YY]
Select CONVERT(varchar,GETDATE(),2) as [YY.MM.DD]
关于日期的所有日期格式代码:
DateFormatCode Format
1 [MM/DD/YY]
2 [YY.MM.DD]
3 [DD/MM/YY]
4 [DD.MM.YY]
5 [DD-MM-YY]
6 [DD MMM YY]
7 [MMM DD,YY]
10 [MM-DD-YY]
11 [YY/MM/DD]
12 [YYMMDD]
23 [yyyy-mm-dd]
101 [MM/DD/YYYY]
102 [YYYY.MM.DD]
103 [DD/MM/YYYY]
104 [DD/MM/YYYY]
105 [DD/MM/YYYY]
106 [DD MMM YYYY]
107 [MMM DD,YYYY]
110 [MM-DD-YYYY]
111 [YYYY/MM/DD]
112 [YYYYMMDD]
我在没有时间部分的情况下获取日期的常用方法..
SELECT CONVERT(VARCHAR(MAX),GETDATE(),103)
SELECT CAST(GETDATE() AS DATE)
如果你想显示日期2008-09-22 00:00:00.000
然后你可以使用
SELECT CONVERT(datetime, (ROUND(convert(float, getdate()-.5),0)))
这将以问题中的格式显示日期
我的风格
select Convert(smalldatetime,Convert(int,Convert(float,getdate())))
select cast(createddate as date) as derivedate from table
createdate 是您的日期时间列,这适用于 sqlserver
您可以使用如下所示的不同类型的输出仅用于日期
SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 103))
-----dd/mm/yyyy
SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 101))
------mm/dd/yyyy
SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 102))
哇,让我数一数你能做到这一点的方法。(没有双关语)
为了以这种格式获得您想要的结果:
2008-09-22
这里有几个选项。
SELECT CAST(GETDATE() AS DATE) AS 'Date1'
SELECT Date2 = CONVERT(DATE, GETDATE())
SELECT CONVERT(DATE, GETDATE()) AS 'Date3'
SELECT CONVERT(CHAR(10), GETDATE(), 121) AS 'Date4'
SELECT CONVERT(CHAR(10), GETDATE(), 126) AS 'Date5'
SELECT CONVERT(CHAR(10), GETDATE(), 127) AS 'Date6'
所以,我建议选择一个你觉得舒服的方法,并在你的所有桌子上全面使用这种方法。
所有这些选项都以完全相同的格式返回日期。为什么 SQL Server 有这样的冗余?
我不知道,但他们知道。也许比我聪明的人可以回答这个问题。
希望这可以帮助某人。
由于自从这个问题得到答案以来发生了很多变化,我想提供一种新的方法来获得所请求的结果。有两种方法可以解析 DATETIME 数据。首先,要获取此问题所要求的日期:
DATEVALUE([TableColumnName])
二、从值中获取时间:
TIMEVALUE([TableColumnName])
例子:
表:客户
列:CreationDate 作为 DateTime
[客户].[创建日期]:2/7/2020 09:50:00
DATEVALUE([Customers].[CreationDate]) '--> Output: 2/7/2020
TIMEVALUE([Customers].[CreationDate]) '--> Output: 09:50:00
我希望这会有所帮助,因为我搜索了一段时间并找到了许多答案,如在这个问题中看到的,但没有一个有效。IECAST
和CONVERT
.
快乐编码!
您可以简单地使用下面的代码仅获取日期部分并避免 SQL 中的时间部分:
SELECT SYSDATE TODAY FROM DUAL;
select convert(getdate() as date)
select CONVERT(datetime,CONVERT(date, getdate()))
最简单的方法是使用:
SELECT DATE(GETDATE())