Sql 为什么在getdate()上使用left()会将其更改为不同的数据类型?

Sql 为什么在getdate()上使用left()会将其更改为不同的数据类型?,sql,sql-server,getdate,Sql,Sql Server,Getdate,运行两个简单的select语句: SELECT GETDATE() SELECT LEFT(GETDATE(), 10) 返回: 2015-10-30 14:19:56.697 Oct 30 201 我原以为LEFT()会给我2015-10-30,但事实并非如此 有人知道为什么吗?这与数据类型GETDATE返回的样式有关吗 谢谢 GETDATE()返回一个datetime值。当您选择GETDATE()时,应用程序将获得一个日期时间值并确定如何显示它。您正在使用的应用程序正在明智地选择

运行两个简单的select语句:

SELECT GETDATE() 

SELECT LEFT(GETDATE(), 10)
返回:

2015-10-30 14:19:56.697 

Oct 30 201
我原以为
LEFT()
会给我
2015-10-30
,但事实并非如此

有人知道为什么吗?这与数据类型
GETDATE
返回的样式有关吗

谢谢

GETDATE()
返回一个
datetime
值。当您选择GETDATE()时,应用程序将获得一个日期时间值并确定如何显示它。您正在使用的应用程序正在明智地选择ISO标准格式

当您执行
LEFT(GETDATE()
)时,数据库需要执行从
datetime
到某个字符串值的隐式转换。为此,它使用其国际化设置。您看到的是基于这些设置的

这个故事的寓意是:避免隐式转换。始终明确您正在做的事情,尤其是在SQL中,因为SQL的诊断功能非常差。因此,请使用具有适当格式的
CONVERT()

GETDATE()命令返回一个日期时间,您希望返回日期

SELECT CONVERT(DATE,GETDATE());

老实说,我希望它会抛出一个异常。左边是一个字符串函数,因此这里显然发生了隐式转换。我理解这可能不是问题的重点,但如果您只需要日期,可以使用
convert(date,getdate())
或在SQL Server 2012及更新版本中,可以使用
SELECT格式(SYSDATETIME(),'yyyy-MM-dd');
要准确获取所需的内容……直接从中获取所需的任何格式的日期,请使用类似于以下内容的内容:
格式(GETDATE(),'yyyy-MM-dd'))
,并更改日期字段的顺序和分隔符。如果需要,您可以使用Sam的代码对其进行字符串化。@Siyual已修复。我在发布时就知道了,但假设大多数人会认识到这是一个MySQL函数。可以从w3schools中学到很多东西,但最好的办法是利用测试场地(例如(联机)sqlfiddle或SQL Server Lite,以防您的家庭或工作环境尚未设置。这表示默认转换为0,而不是国际化设置。首先不应将其作为注释:)回答得很好。@Nick.McDermaid…我会让你参考Aaron Bertrand关于这个话题的讨论:。通常我会屈服于Aaron和你自己的智慧,但这意味着date>varchar转换只坚持一种格式:
SET DATEFORMAT DMY;选择cast(getdate()作为varchar);SET DATEFORMAT MDY;选择cast(getdate()作为varchar);设置语言为英语;选择cast(getdate()为varchar);设置语言为US_英语;选择cast(getdate()为varchar);
很高兴设置正确。感谢您的澄清(在回答和评论之间)!这并不是说我期望这是正确的方法,我只是好奇是什么导致了不同的输出。答案被接受:)