如何从TSQL日期时间字段获取YYYY-MM-DD格式的日期?


259

如何从SQL Server检索YYYY-MM-DD格式的日期?我需要使用它才能与SQL Server 2000及更高版本一起使用。有没有一种简单的方法可以在SQL Server中执行此操作,或者在检索结果集之后以编程方式对其进行转换会更容易吗?

我已经在Microsoft Technet上阅读了CAST和CONVERT,但是没有列出我想要的格式,并且更改日期格式不是一种选择。


126的BOL描述有点混乱(从未找到对“ T”的解释)。
nojetlag

“ T”将日期与时间分开。 参见Wikipedia上的ISO 8601
krubo 2012年

Answers:


428
SELECT CONVERT(char(10), GetDate(),126)

限制不需要的小时部分的varchar排的大小。


3
否,但是某些客户在固定长度上存在问题。
gbn

54
该帖子出现在Google上,用于转换为YYYYMMDD-这样的原因是:CONVERT(char(10),GetDate(),112)
NealWalters 2014年

1
这对我不起作用,上面有代码112的建议确实有效。感谢@NealWalters
AlexVPerl 2014年

4

代码126适用于诸如YYYY-mm-dd格式的出生日期等日期:CONVERT(char(10),pat_dob,126)as pat_dob
jjwdesign 2015年

118
SELECT convert(varchar, getdate(), 100) -- mon dd yyyy hh:mmAM

SELECT convert(varchar, getdate(), 101) -- mm/dd/yyyy – 10/02/2008                  

SELECT convert(varchar, getdate(), 102) -- yyyy.mm.dd – 2008.10.02           

SELECT convert(varchar, getdate(), 103) -- dd/mm/yyyy

SELECT convert(varchar, getdate(), 104) -- dd.mm.yyyy

SELECT convert(varchar, getdate(), 105) -- dd-mm-yyyy

SELECT convert(varchar, getdate(), 106) -- dd mon yyyy

SELECT convert(varchar, getdate(), 107) -- mon dd, yyyy

SELECT convert(varchar, getdate(), 108) -- hh:mm:ss

SELECT convert(varchar, getdate(), 109) -- mon dd yyyy hh:mm:ss:mmmAM (or PM)

SELECT convert(varchar, getdate(), 110) -- mm-dd-yyyy

SELECT convert(varchar, getdate(), 111) -- yyyy/mm/dd

SELECT convert(varchar, getdate(), 112) -- yyyymmdd

SELECT convert(varchar, getdate(), 113) -- dd mon yyyy hh:mm:ss:mmm

SELECT convert(varchar, getdate(), 114) -- hh:mm:ss:mmm(24h)

SELECT convert(varchar, getdate(), 120) -- yyyy-mm-dd hh:mm:ss(24h)

SELECT convert(varchar, getdate(), 121) -- yyyy-mm-dd hh:mm:ss.mmm

SELECT convert(varchar, getdate(), 126) -- yyyy-mm-ddThh:mm:ss.mmm

1
如何获取“ m / d / yyyy”而不是“ mm / dd / yyyy”
user_az

到目前为止,这是最有用的答案。
丹尼尔(Daniel)


35

网上表格中列出了您需要的表格。

http://msdn.microsoft.com/zh-CN/library/aa226054(SQL.80).aspx

例如,尝试以下操作:

select convert(varchar,getDate(),120)
select convert(varchar(10),getDate(),120)

4
如果使用默认值,则在这种情况下,您将获得时间值-格式120的整个格式为'yyyy-mm-dd hh:mi:ss'。通过明确声明长度,可以将其修整为您在原始注释中指定的格式-'yyyy-mm-dd'。
DaveE,2009年

26

convert带有格式说明符120 的函数将为您提供格式“ yyyy-MM-dd HH:mm:ss”,因此您只需将长度限制为10即可仅获取日期部分:

convert(varchar(10), theDate, 120)

但是,格式化日期通常最好在表示层而不是数据库或业务层中进行。如果返回从数据库格式化的日期,则客户端代码如果需要对其进行任何计算,则必须再次将其解析为日期。

C#中的示例:

theDate.ToString("yyyy-MM-dd")

1
为什么要下票?如果您不解释自己认为是错的是什么,那么它就无法改善答案。
Guffa 2014年

14

对于YYYYMMDD,请尝试

select convert(varchar,getDate(),112)

我只在SQLServer2008上进行过测试。


7

另一种方式

CONVERT(varchar, DATEPART(yyyy, @datetime)) + '/' + CONVERT(varchar, DATEPART(mm, @datetime)) + '/' + CONVERT(varchar, DATEPART(dd, @datetime)) 

1
如果您要2毫米mm / dd,则需要左键填充日期,这将创建1位数字的日期(如2012年8月3日)。RIGHT('00'+ CONVERT(varchar,DATEPART(yyyy,@datetime)),2)例如
MindStalker

7

对于那些也想要时间部分的人(我确实希望这样做),以下代码段可能会有所帮助

SELECT convert(varchar, getdate(), 120) -- yyyy-mm-dd hh:mm:ss(24h)
SELECT convert(varchar, getdate(), 121) -- yyyy-mm-dd hh:mm:ss.mmm
SELECT convert(varchar, getdate(), 126) -- yyyy-mm-ddThh:mm:ss.mmm
                              --example -- 2008-10-02T10:52:47.513



5

在您的转换链接中,使用样式126:

CONVERT (varchar(10), DTvalue, 126)

这缩短了时间。您要求在yyyy-mm-dd中具有它意味着它必须是字符串数据类型和日期时间。

坦白说,除非您有充分的理由,否则我会在客户端上执行此操作。



3

我不确定为什么上面的答案中最简单的方法被忽略/省略了:

SELECT FORMAT(GetDate(),'yyyy-MM-dd');--= 2020-01-02

SELECT FORMAT(GetDate(),'dd MMM yyyy HH:mm:ss');-- = 02 Jan 2020 08:08:08

我喜欢第二种语言,因为无论您使用哪种语言,您都可以了解它的日期!

当您将其发送到保存过程时,无论计算机中设置了哪种区域格式,SQL Server都会始终“理解”它-我始终使用全年(yyyy),月份名称(MMM)和24小时格式(大写HH)在我的编程中花了一个小时。



2

您也可以使用。这是通过使用新的数据类型DATE。可能无法在所有以前的版本中使用,但是大大简化了在更高版本中的使用。

SELECT CAST(getdate() AS DATE)
SELECT LEFT(CAST(getdate() AS DATE), 7)

1

我会用:

CONVERT(char(10),GETDATE(),126)

1
SELECT Code,Description FROM TABLE

-- This will Include only date part of 14th March 2010. Any date with date companents will not be considered.
WHERE ID= 1 AND FromDate >= CONVERT(DATETIME, '2010-02-14', 126) AND ToDate <= DATEADD(dd, 1, CONVERT(DATETIME, '2010-03-14', 126))

-- This will Include the whole day of 14th March 2010
--WHERE ID= 1 AND FromDate >= CONVERT(DATETIME, '2010-02-14', 126) AND ToDate < DATEADD(dd, 1, CONVERT(DATETIME, '2010-03-14', 126))

1

在SQL Server 2008中,您可以执行以下操作: CONVERT(date,getdate())


1

如果您希望日期用斜杠分隔,似乎不需要做任何奇怪的事情。只需使用反斜杠将其转义即可。否则,您将得到一个圆点。

SELECT FORMAT(GETDATE(),'yyyy\/MM');  

在SQL Server 2016上测试


0

对每个convert / cast函数使用CASE语句始终对我有用:

请用表名替换tableXXXXY,并用该表中datetime字段的名称替换issueDate_dat:

SELECT  issueDate_dat, CONVERT(varchar, DATEPART(yyyy, issuedate_dat))  AS issueDateYYYY
, CASE WHEN (len(CONVERT(varchar, DATEPART(mm, issuedate_dat))) < 2) THEN '0' +CONVERT(varchar, DATEPART(mm, issuedate_dat)) ELSE CONVERT(varchar, DATEPART(mm, issuedate_dat)) END AS  issueDateMM
, CASE WHEN (len(CONVERT(varchar, DATEPART(dd, issuedate_dat))) <2) THEN '0' +CONVERT(varchar, DATEPART(dd, issuedate_dat)) ELSE CONVERT(varchar, DATEPART(dd, issuedate_dat)) END AS issueDateDD
FROM            tableXXXXY

希望这会有所帮助。查伯特。


0

此解决方案对我有效,简单有效(也有126个)

CONVERT(NVARCHAR(MAX), CAST(GETDATE() as date), 120)

0

如果您的原始日期格式都弄乱了,请尝试以下方法:

select
convert(nvarchar(50),year(a.messedupDate))+'-'+
(case when len(convert(nvarchar(50),month(a.messedupDate)))=1 
    then '0'+ convert(nvarchar(50),month(a.messedupDate))+'-' 
    else convert(nvarchar(50),month(a.messedupDate)) end)+
(case when len(convert(nvarchar(50),day(a.messedupDate)))=1 
    then '0'+ convert(nvarchar(50),day(a.messedupDate))+'-'
    else convert(nvarchar(50),day(a.messedupDate)) end) 
from messytable a

0
 IFormatProvider culture = new System.Globalization.CultureInfo("fr-FR", true);

cmdGetPaymentStatement.Parameters.AddWithValue("@pStartDate", DateTime.Parse("22/12/2017", culture, System.Globalization.DateTimeStyles.AssumeLocal)).IsNullable = true;

上面的代码用于以mm / dd / yyyy的形式提供参数的存储过程
Raj Kumar,2008年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.