edd*_*ves 1692 sql t-sql sql-server datetime date
SELECT GETDATE()
Run Code Online (Sandbox Code Playgroud)
返回: 2008-09-22 15:24:13.790
我希望那个日期部分没有时间部分: 2008-09-22 00:00:00.000
我怎么能得到它?
aku*_*aku 2401
在SQL Server 2008更高,你应该CONVERT约会:
SELECT CONVERT(date, getdate())
Run Code Online (Sandbox Code Playgroud)
在旧版本上,您可以执行以下操作:
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, @your_date))
Run Code Online (Sandbox Code Playgroud)
例如
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))
Run Code Online (Sandbox Code Playgroud)
给我
2008-09-22 00:00:00.000
Run Code Online (Sandbox Code Playgroud)
优点:
varchar< - > datetime转换localeBen*_*enR 705
SQLServer 2008现在具有"日期"数据类型,该类型仅包含没有时间组件的日期.使用SQLServer 2008及更高版本的任何人都可以执行以下操作:
SELECT CONVERT(date, GETDATE())
Run Code Online (Sandbox Code Playgroud)
aba*_*hev 163
如果使用SQL 2008及更高版本:
select cast(getdate() as date)
Run Code Online (Sandbox Code Playgroud)
Ric*_*o C 71
DATEADD和DATEDIFF优于CONVERTing到varchar.两个查询都具有相同的执行计划,但执行计划主要是关于数据访问策略,并不总是揭示执行所有部分所花费的CPU时间所涉及的隐式成本.如果两个查询都针对具有数百万行的表运行,则使用DateDiff的CPU时间可能接近转换CPU时间的1/3!
要查看查询的执行计划:
set showplan_text on
GO
Run Code Online (Sandbox Code Playgroud)
DATEADD和DATEDIFF都将执行CONVERT_IMPLICIT.
虽然CONVERT解决方案更简单,更容易阅读一些,它是速度较慢.无需强制转换回日期时间(这由服务器隐式完成).之后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]))
Run Code Online (Sandbox Code Playgroud)
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]))
Run Code Online (Sandbox Code Playgroud)
使用FLOOR()作为@digi建议的性能更接近DateDiff,但不建议将datetime数据类型转换为float并且back并不总是产生原始值.
记住伙计们:不要相信任何人.查看性能统计信息,并自行测试!
在测试结果时要小心.为客户端选择多行将隐藏性能差异,因为通过网络发送行所需的时间比执行计算所需的时间长.因此,请确保所有行的工作都由服务器完成,但没有行集发送到客户端.
某些人似乎对缓存优化何时影响查询感到困惑.在同一批次或不同批次中运行两个查询对缓存没有影响.因此,您可以手动使缓存过期,也可以只是多次来回运行查询.查询#2的任何优化也会影响任何后续查询,因此如果您愿意,请抛弃执行#1.
以下是完整的测试脚本和性能结果,证明DateDiff比转换为varchar要快得多.
Nes*_*cio 49
试试这个:
SELECT CONVERT(VARCHAR(10),GETDATE(),111)
Run Code Online (Sandbox Code Playgroud)
以上语句将您当前的格式转换为YYYY/MM/DD,请参阅此链接以选择您喜欢的格式.
Cad*_*oux 39
SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 101))
Run Code Online (Sandbox Code Playgroud)
Dav*_*veK 21
您可以使用该CONVERT功能仅返回日期.请参阅以下链接:
使用convert函数的语法是:
CONVERT ( data_type [ ( length ) ] , expression [ , style ] )
Run Code Online (Sandbox Code Playgroud)
Mah*_* ML 20
以日期格式返回
CAST(OrderDate AS日期)
上面的代码将在sql server 2010中运行
它将像12/12/2013一样返回
对于SQL Server 2012,请使用以下代码
CONVERT(VARCHAR(10), OrderDate , 111)
Run Code Online (Sandbox Code Playgroud)
小智 15
如果你需要varchar数据类型的结果,你应该通过
SELECT CONVERT(DATE, GETDATE()) --2014-03-26
SELECT CONVERT(VARCHAR(10), GETDATE(), 111) --2014/03/26
Run Code Online (Sandbox Code Playgroud)
这已经在上面提到了
如果您需要结果的日期和时间格式,您应该通过以下任何查询
1)varcharas OnlyDate --2014-03-26 00:00:00.000
2)varcharas OnlyDate - 2014-03-26 00:00:00.000
3)
SELECT CONVERT(DATETIME, CONVERT(VARCHAR(10), GETDATE(), 111)) AS OnlyDate
Run Code Online (Sandbox Code Playgroud)
--2014-03-26 00:00:00.000
小智 14
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
Run Code Online (Sandbox Code Playgroud)
DiG*_*iGi 13
使用FLOOR() - 只是削减时间部分.
SELECT CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME)
Run Code Online (Sandbox Code Playgroud)
Som*_*luk 13
使用Format()功能.
SQL Server已有多种答案和格式类型.但是大多数方法都有些含糊不清,很难记住特定日期格式的格式类型或函数的数字.这就是为什么在SQL Server的下一个版本中有更好的选择.
FORMAT ( value, format [, culture ] )
Run Code Online (Sandbox Code Playgroud)
文化选项非常有用,因为您可以根据查看者指定日期.
你必须记住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)
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)
查询中的更多示例.
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?
Run Code Online (Sandbox Code Playgroud)
如果您想要更多格式,可以去:
小智 12
如果你想使用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操作,除非您进行某种手动恢复,这在需要时再次将您的数据暴露给human/code/gremlin错误.
yus*_*ver 11
句法:
SELECT CONVERT (data_type(length)),Date, DateFormatCode)
Run Code Online (Sandbox Code Playgroud)
前任:
Select CONVERT(varchar,GETDATE(),1) as [MM/DD/YY]
Select CONVERT(varchar,GETDATE(),2) as [YY.MM.DD]
Run Code Online (Sandbox Code Playgroud)
关于日期的所有日期格式代码:
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]
Run Code Online (Sandbox Code Playgroud)
Gor*_*ell 10
SELECT DATEADD(DD, DATEDIFF(DD, 0, GETDATE()), 0)
SELECT DATEADD(DAY, 0, DATEDIFF(DAY,0, GETDATE()))
SELECT CONVERT(DATETIME, CONVERT(VARCHAR(10), GETDATE(), 101))
Run Code Online (Sandbox Code Playgroud)
编辑:前两个方法基本相同,并执行转换为varchar方法.
小智 10
要获得指示的结果,我使用以下命令.
SELECT CONVERT(DATETIME,CONVERT(DATE,GETDATE()))
Run Code Online (Sandbox Code Playgroud)
我说它很有用.
小智 8
Convert(nvarchar(10), getdate(), 101) ---> 5/12/14
Convert(nvarchar(12), getdate(), 101) ---> 5/12/2014
Run Code Online (Sandbox Code Playgroud)
如果要将结果分配给列或变量,请为其指定DATE类型,并且隐式转换.
DECLARE @Date DATE = GETDATE()
SELECT @Date --> 2017-05-03
Run Code Online (Sandbox Code Playgroud)
我认为这适用于您的情况:
CONVERT(VARCHAR(10),Person.DateOfBirth,111) AS BirthDate
//here date is obtained as 1990/09/25
Run Code Online (Sandbox Code Playgroud)
为什么不使用 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 的顺序
小智 6
DECLARE @yourdate DATETIME = '11/1/2014 12:25pm'
SELECT CONVERT(DATE, @yourdate)
Run Code Online (Sandbox Code Playgroud)
我赞成以下未提及的内容:
DATEFROMPARTS(DATEPART(yyyy, @mydatetime), DATEPART(mm, @mydatetime), DATEPART(dd, @mydatetime))
Run Code Online (Sandbox Code Playgroud)
它也不关心本地或进行双重转换——尽管每个“日期部分”可能都会进行数学运算。所以它可能比 datediff 方法慢一点,但对我来说它更清晰。特别是当我只想按年和月分组(将日期设置为 1)时。
我知道这很旧,但我看不出有人这样说。据我所知,这是 ANSI 标准。
SELECT CAST(CURRENT_TIMESTAMP AS DATE)
Run Code Online (Sandbox Code Playgroud)
如果 Microsoft 也能够支持 ANSI 标准 CURRENT_DATE 变量,那就太好了。
好的,虽然我有点迟了:),这是另一个解决方案.
SELECT CAST(FLOOR(CAST(GETDATE() AS FLOAT)) as DATETIME)
Run Code Online (Sandbox Code Playgroud)
结果
2008-09-22 00:00:00.000
Run Code Online (Sandbox Code Playgroud)
如果您使用的是SQL Server 2012及更高版本,则可以使用FORMAT()此类功能 -
SELECT FORMAT(GETDATE(), 'yyyy-MM-dd')
Run Code Online (Sandbox Code Playgroud)
小智 5
您可以将以下内容用于日期部分并格式化日期:
DATENAME => 返回表示指定日期的指定日期部分的字符串
DATEADD => 该DATEPART()函数用于返回日期/时间的单个部分,例如年、月、日、小时、分钟等。
DATEPART =>返回一个整数,表示指定日期的指定日期部分。
CONVERT()=> 该CONVERT()函数是将一种数据类型的表达式转换为另一种数据类型的通用函数。该
CONVERT()函数可用于以不同格式显示日期/时间数据。
即使使用古老的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)
Run Code Online (Sandbox Code Playgroud)
它产生了这个输出:
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
Run Code Online (Sandbox Code Playgroud)
日期:
SELECT CONVERT(日期,GETDATE()) SELECT CAST(GETDATE()作为日期)
时间:
SELECT CONVERT(时间,GETDATE(),114) SELECT CAST(GETDATE()作为时间)
在 SQL Server 2000 上
CAST(
(
STR( YEAR( GETDATE() ) ) + '/' +
STR( MONTH( GETDATE() ) ) + '/' +
STR( DAY( GETDATE() ) )
)
AS DATETIME)
Run Code Online (Sandbox Code Playgroud)
小智 5
只需执行以下操作即可:
SELECT CONVERT(date, getdate())
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, @your_date))
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))
Run Code Online (Sandbox Code Playgroud)
输出为:
2008-09-22 00:00:00.000
Run Code Online (Sandbox Code Playgroud)
或者干脆像这样:
SELECT CONVERT (DATE, GETDATE()) 'Date Part Only'
Run Code Online (Sandbox Code Playgroud)
结果:
Date Part Only
--------------
2013-07-14
Run Code Online (Sandbox Code Playgroud)