如何从TSQL datetime字段获得YYYY-MM-DD格式的日期?

如何从SQL Server中检索YYYY-MM-DD格式的日期?我需要这个工作与SQL Server 2000及更高。是否有一个简单的方法来执行这在SQL Server或它会更容易转换后,我检索的结果集?

我已经在Microsoft Technet上阅读了转换和转换,但我想要的格式没有列出,改变日期格式不是一个选项。

1322188 次浏览

您所需要的表格在图书在线文档中列出。

http://msdn.microsoft.com/en-us/library/aa226054(SQL.80).aspx

例如,尝试以下方法:

select convert(varchar,getDate(),120)
select convert(varchar(10),getDate(),120)
SELECT CONVERT(char(10), GetDate(),126)

限制您不想要的小时部分的varchar排骨的大小。

在你的强制转换链接中,使用样式126:

CONVERT (varchar(10), DTvalue, 126)

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

坦率地说,除非你有充分的理由不这么做,否则我会在客户端上这么做。

SELECT CONVERT(NVARCHAR(20), GETDATE(), 23)

我会用:

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

带有格式说明符120的convert函数将为你提供格式“yyyy-MM-dd HH:mm:ss”,所以你只需要将长度限制为10来获得日期部分:

convert(varchar(10), theDate, 120)

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

c#中的例子:

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

对于YYYYMMDD,请尝试

select convert(varchar,getDate(),112)

我只在SQLServer2008上进行了测试。

如果你想在之后再次使用它作为日期而不是varchar,不要忘记将其转换回来:

select convert(datetime,CONVERT(char(10), GetDate(),126))

还有一种方法……

CONVERT(varchar, DATEPART(yyyy, @datetime)) + '/' + CONVERT(varchar, DATEPART(mm, @datetime)) + '/' + CONVERT(varchar, DATEPART(dd, @datetime))
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))
replace(convert(varchar, getdate(), 111), '/','-')

也会做戏法没有“砍任何东西”。

对于那些也想要时间部分的人(我想),下面的片段可能会有所帮助

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

以防有人想要做反过来说并找到这个。

select convert(datetime, '12.09.2014', 104)

这将德国日期格式的字符串转换为datetime对象。

为什么是104年?参见这里:http://msdn.microsoft.com/en-us/library/ms187928.aspx

使用每个转换/强制转换函数的CASE语句总是为我工作:

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

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

希望这对你有帮助。chagbert。

SQL Server 2012开始(最初的问题是针对2000年的):

SELECT FORMAT(GetDate(), 'yyyy-MM-dd')

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

如果你的源日期格式乱七八糟,试试下面的方法:

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

这个方法对我来说很有效,简单有效(也有126条)

CONVERT(NVARCHAR(MAX), CAST(GETDATE() as date), 120)
 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;

从SQL Server 2008你可以这样做:CONVERT(date,getdate())

你也可以用。这是通过使用新的数据类型DATE实现的。可能不能在所有以前的版本工作,但大大简化了在以后的版本中使用。

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

我不知道为什么最简单的方法在上面的答案中被忽略了:

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)来表示小时。

似乎没有必要做任何奇怪的事情,如果你想让你的日期以斜线分隔。 只需用反斜杠转义即可。否则你将以一个点结尾。

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

在SQL Server 2016上测试

由于字符串处理是昂贵的,FORMAT更是如此,我很惊讶Asher/Aaron Dietz的响应不是更高,如果不是顶级的;问题是寻找ISO 8601日期,并没有特别要求它作为字符串类型。

最有效的方法可能是以下任何一种(为了完整起见,我已经包括了Asher/Aaron Dietz提出的答案):

所有版本

select  cast(getdate() as date)
select  convert(date, getdate())

2008年及以上

select  convert(date, current_timestamp)

ANSI SQL等效2008和更高

select  cast(current_timestamp as date)

引用:

https://sqlperformance.com/2015/06/t-sql-queries/format-is-nice-and-all-but

https://en.wikipedia.org/wiki/ISO_8601

https://www.w3schools.com/sql/func_sqlserver_current_timestamp.asp

https://learn.microsoft.com/en-us/sql/t-sql/functions/current-timestamp-transact-sql?view=sql-server-ver15