提问人:Eddie Groves 提问时间:9/22/2008 最后编辑:Shu RahmanEddie Groves 更新时间:3/25/2023 访问量:3617272
如何仅从 SQL Server DateTime 数据类型返回 Date
How to return only the Date from a SQL Server DateTime datatype
问:
SELECT GETDATE()
返回:2008-09-22 15:24:13.790
我想要没有时间部分的日期部分:2008-09-22 00:00:00.000
我怎样才能得到它?
答:
试试这个:
SELECT CONVERT(VARCHAR(10),GETDATE(),111)
上面的语句将您当前的格式转换为 ,请参阅此链接以选择您喜欢的格式。YYYY/MM/DD
评论
mm/dd/yyyy
SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 101))
注意:此答案返回原始 DATETIME
或 DATETIME2
类型。有关返回 true DATE
类型的表达式(SQL Server 2008 及更高版本),请参阅下面的 BenR 答案。
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, @your_date))
例如
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))
给我
2008-09-22 00:00:00.000
优点:
- 无需 varchar<->datetime 转换
- 无需考虑语言环境
评论
datetime
Convert(varchar(30), @Date, 101)
CAST(... AS DATE)
CONVERT(DATE, ...)
datepart
关键字,以在任意级别截断您的。SELECT DATEADD(dd, DATEDIFF(dd, 0, @your_date), 0)
dd
datetime
您可以使用该函数仅返回日期。请参阅以下链接:CONVERT
使用 convert 函数的语法为:
CONVERT ( data_type [ ( length ) ] , expression [ , style ] )
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方法。
评论
datepart
关键字,以在您选择的任何段上裁剪日期。(另请注意,这只是 的缩写。select dateadd(dd, datediff(dd, 0, getdate()), 0)
dd
dd
day
DECLARE @myDate DATETIME2 = '2020-12-31 23:59:59.998911';
SELECT @myDate AS orig_date, DATEADD(dd, 0, DATEDIFF(dd, 0, @myDate)) AS truncated_date
使用 FLOOR() - 只需剪切时间部分。
SELECT CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME)
评论
DATEADD 和 DATEDIFF 比 CONVERTing to varchar 更好。这两个查询具有相同的执行计划,但执行计划主要与数据访问策略有关,并不总是揭示执行所有部分所花费的 CPU 时间所涉及的隐性成本。如果两个查询都针对包含数百万行的表运行,则使用 DateDiff 的 CPU 时间可能接近转换 CPU 时间的 1/3!
若要查看查询的执行计划,请执行以下操作:
set showplan_text on
GO
DATEADD 和 DATEDIFF 都将执行CONVERT_IMPLICIT。
尽管 CONVERT 解决方案对某些人来说更简单、更易于阅读,但它的速度较慢。无需强制转换回 DateTime(这是由服务器隐式完成的)。之后,DateDiff 方法中也不需要 DateAdd,因为整数结果也将隐式转换回 DateTime。
SELECT CONVERT(varchar, MyDate, 101) FROM DatesTable
|--Compute Scalar(DEFINE:([Expr1004]=CONVERT(varchar(30),[TEST].[dbo].[DatesTable].[MyDate],101)))
|--Table Scan(OBJECT:([TEST].[dbo].[DatesTable]))
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, MyDate)) FROM DatesTable
|--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 数据类型转换为浮点数并返回并不总是产生原始值。
记住伙计们:不要相信任何人。查看性能统计数据,并亲自测试!
测试结果时要小心。为客户端选择多行将隐藏性能差异,因为通过网络发送行所需的时间比执行计算所需的时间更长。因此,请确保所有行的工作都由服务器完成,但没有向客户端发送任何行集。
对于某些人来说,缓存优化何时会影响查询似乎感到困惑。在同一批处理或单独的批处理中运行两个查询对缓存没有影响。因此,您可以手动使缓存过期,也可以多次来回运行查询。查询 #2 的任何优化也会影响任何后续查询,因此如果您愿意,请抛出执行 #1。
以下是完整的测试脚本和性能结果,证明 DateDiff 比转换为 varchar 要快得多。
评论
SQLServer 2008 现在具有“date”数据类型,该数据类型仅包含日期,不包含时间部分。使用 SQLServer 2008 及更高版本的任何人都可以执行以下操作:
SELECT CONVERT(date, GETDATE())
评论
如果使用 SQL 2008 及更高版本:
select cast(getdate() as date)
评论
2015-10-01
DateTime
Date
2015-10-01
declare @date1 datetime = '2015-09-30 23:59:59.999';select @date1
=> 2015-10-01
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
如果要使用 CONVERT 并获得与原始问题中相同的输出,即 yyyy-mm-dd,则使用与前几个答案相同的代码,但转换为带有破折号的 yyyy-mm-dd 的代码是 121。CONVERT(varchar(10),[SourceDate as dateTime],121)
如果我能在我的肥皂盒上一秒钟,这种格式不属于数据层,这就是为什么在 SQL Server 2008 引入实际的 datepart 数据类型之前,如果没有愚蠢的高开销“技巧”,就不可能实现。在数据层中进行此类转换会浪费 DBMS 的大量开销,但更重要的是,当您执行此类操作时,您基本上已经创建了内存中的孤立数据,我假设您将返回到程序中。你不能把它放在另一个 3NF+ 列中,或者在不还原的情况下将其与任何类型进行比较,所以你所做的只是引入故障点并删除关系引用。
您应该始终继续并将 dateTime 数据类型返回到调用程序,并在 PRESENTATION 层中进行任何必要的调整。一旦在将内容返回给调用方之前进行转换,就会从应用程序中消除引用完整性的所有希望。这将再次阻止 UPDATE 或 DELETE 操作,除非您执行某种手动还原,这再次将您的数据暴露给 human/code/gremlin 错误,而不需要。
评论
WHERE col >= @Date AND col < DATEADD(DAY, 1, @Date);
@Date
为了获得指示的结果,我使用以下命令。
SELECT CONVERT(DATETIME,CONVERT(DATE,GETDATE()))
我认为它很有用。
我认为这适用于您的情况:
CONVERT(VARCHAR(10),Person.DateOfBirth,111) AS BirthDate
//here date is obtained as 1990/09/25
对于以日期格式返回
CAST(订单日期为日期)
上面的代码将在 sql server 2010 中工作
它将像 12/12/2013 一样返回
对于 SQL Server 2012,请使用以下代码
CONVERT(VARCHAR(10), OrderDate , 111)
评论
如果您需要结果作为 ,您应该通过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
您可以对日期部分使用以下内容并设置日期格式:
DATENAME => 返回一个字符串,该字符串表示指定日期的指定日期部分
DATEADD => 该函数用于返回日期/时间的单个部分,例如年、月、日、小时、分钟等。DATEPART()
DATEPART =>返回一个整数,该整数表示指定日期的指定日期部分。
CONVERT()
= > 该函数是将一种数据类型的表达式转换为另一种数据类型的通用函数。
该函数可用于以不同格式显示日期/时间数据。CONVERT()
CONVERT()
Convert(nvarchar(10), getdate(), 101) ---> 5/12/14
Convert(nvarchar(12), getdate(), 101) ---> 5/12/2014
为什么不使用 DATE_FORMAT( your_datetiem_column, '%d-%m-%Y' ) ?
前任:select DATE_FORMAT( some_datetime_column, '%d-%m-%Y' ) from table_name
您可以通过重新排列零件来更改 M、D 和年份的顺序'%d-%m-%Y'
DECLARE @yourdate DATETIME = '11/1/2014 12:25pm'
SELECT CONVERT(DATE, @yourdate)
评论
即使使用古老的 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
我赞成以下未提及的内容:
DATEFROMPARTS(DATEPART(yyyy, @mydatetime), DATEPART(mm, @mydatetime), DATEPART(dd, @mydatetime))
它也不关心本地或进行双重转换——尽管每个“datepart”都可能做数学运算。所以它可能比 datediff 方法慢一点,但对我来说它更清楚。特别是当我想只按年和月分组时(将日期设置为 1)。
Date(date&time field) 和 DATE_FORMAT(date&time,'%Y-%m-%d') 都仅返回日期和时间中的日期
评论
SELECT * FROM tablename WHERE CAST ([my_date_time_var] AS DATE)= '8/5/2015'
我知道这已经很老了,但我看不出有人这样说。据我所知,这是ANSI标准。
SELECT CAST(CURRENT_TIMESTAMP AS DATE)
如果Microsoft也可以支持 ANSI 标准CURRENT_DATE变量,那就太好了。
评论
select {fn current_date()} as today
对我有用。
您可以简单地使用下面的代码来仅获取日期部分,并避免 SQL 中的时间部分:
SELECT SYSDATE TODAY FROM DUAL;
评论
TRUNC(SYSDATE)
好的,虽然我:)有点晚了,但这是另一种解决方案。
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')
评论
如果要将结果分配给列或变量,请为其指定 DATE 类型,并且转换是隐式的。
DECLARE @Date DATE = GETDATE()
SELECT @Date --> 2017-05-03
日期:
SELECT CONVERT(date, GETDATE()) SELECT CAST(GETDATE() as date)
时间:
SELECT CONVERT(time , GETDATE() , 114) SELECT CAST(GETDATE() as time)
在 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')
如果您使用的是 SQL Server 2012 或更高版本,
使用 Format()
函数。
SQL Server 已经有多个答案和格式类型。 但是大多数方法都有些模棱两可,您很难记住与特定日期格式相关的格式类型或函数的数字。这就是为什么在下一个版本的 SQL Server 中有更好的选择。
FORMAT ( value, format [, culture ] )
区域性选项非常有用,因为您可以根据查看者指定日期。
你必须记住 d(小模式)和 D(长模式)。
1.“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)
2.“D” - 长日期模式。
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日
如果您想要更多格式,可以转到:
评论
FORMAT (@d, 'yyyyy-MM-dd')
简单地说,你可以这样做:
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
我常用的方法就是在没有时间部分的情况下获得日期。
SELECT CONVERT(VARCHAR(MAX),GETDATE(),103)
SELECT CAST(GETDATE() AS DATE)
select convert(getdate() as date)
select CONVERT(datetime,CONVERT(date, getdate()))
评论
我的风格
select Convert(smalldatetime,Convert(int,Convert(float,getdate())))
select cast(createddate as date) as derivedate from table
createdate 是你的 datetime 列,这适用于 sqlserver
您可以像下面这样用于仅日期的不同不同类型的输出
SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 103))
-----dd/mm/yyyySELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 101))
------月/日/年/年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 具有这样的冗余?
我不知道,但他们知道。也许有人比我聪明,可以回答这个问题。
希望这对某人有所帮助。
评论
最简单的方法是使用:SELECT DATE(GETDATE())
评论
如果要显示日期2008-09-22 00:00:00.000
然后你可以使用四舍五入
SELECT CONVERT(datetime, (ROUND(convert(float, getdate()-.5),0)))
这将以问题中的格式显示日期
在本例中,仅日期,我们将运行以下查询:
选择 CONVERT(VARCHAR(10), getdate(), 111);
只需做:
SELECT CAST(date_variable AS date)
或与 PostgreSQL 一起使用:
SELECT date_variable::date
顺便说一句,这被称为类型转换!
由于自从这个问题有了答案以来,已经发生了许多变化,我想提供一种获得所需结果的新方法。有两种方法可以解析 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
我希望这会有所帮助,因为我搜索了一段时间,并找到了这个问题中所看到的许多答案,但没有一个有效。IE 和 .CAST
CONVERT
祝您编码愉快!
语法:
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]
所有 DateFormatcodes 关于 Date:
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]
评论
从 SQL Server 2022 (16.x)SQL Server 2022 (16.x)SQL Server 2022 (16.x)SQL Server 2022 (16.x)SQL Server 2022 (16.x)SQL Server 2022 (16.DATETRUNC()
day
datepart
SELECT DATETRUNC(day, GETDATE());
SELECT CONVERT(varchar(100), GETDATE(), 102); --2023.02.15
SELECT CONVERT(varchar(100), GETDATE(), 23); --2023-02-15
你可以通过这个网址来查找其他格式
https://www.cnblogs.com/wintuzi/p/16164124.html
希望我能帮到你
上一个:在 SQL 表中查找重复值
评论