Sql 查询:分配错误日期时间2

Sql 查询:分配错误日期时间2,sql,sql-server,type-conversion,Sql,Sql Server,Type Conversion,我想使用此代码分配'1392-04-31': DECLARE @t DATETIME SET @t = '92-04-31' 我看到这个错误: 从字符串转换日期和/或时间时,转换失败。 有人知道为什么吗?首先,四月只有30天。我不会花时间去查找历史上1392中是否存在这种情况,但无论如何,我都非常确定1392年4月31日对于SQL Server DATETIME是无效的 此外,您还应使用“01-01-2013”格式的全年 尝试以下操作,您将获得2013年1月1日12:00AM的输出 decla

我想使用此代码分配
'1392-04-31'

DECLARE @t DATETIME
SET @t = '92-04-31'
我看到这个错误:

从字符串转换日期和/或时间时,
转换失败。


有人知道为什么吗?首先,四月只有30天。我不会花时间去查找历史上1392中是否存在这种情况,但无论如何,我都非常确定1392年4月31日对于SQL Server DATETIME是无效的

此外,您还应使用“01-01-2013”格式的全年

尝试以下操作,您将获得2013年1月1日12:00AM的输出

declare @t DATETIME
set @t = '01-01-2013'
PRINT @t

上述内容适用于任何有效日期。

您试图设置的日期可能无效

根据语言、日期格式和其他设置,SQL中还有几种将日期表示为字符串的方法。通常,最安全的方法是使用“YYYYMMDD”格式

下面的文章也将回答这个问题:为什么1753年是datetime的最早日期

如果您想了解一些详细信息,请阅读以下内容:

解决方案是: 使用datetime2

DECLARE @t datetime2
SET @t = '1392-04-30'
因为您不能使用datetime: datetime中存储的最小日期为1753年1月1日。所以1392是不可存储的

四月有30天

使用带日期时间的格式化日期:

其次,当您在Sql Server中写入日期时,我喜欢的格式是{d'YYYY-MM-DD'},因此在您的情况下变成:

DECLARE @t DATETIME
SET @t = {d '1992-04-30'}
要完成此讨论,如果要使用hh-mm-ss,则必须使用以下格式:{ts'yyy-mm-dd hh:mm:ss.mmm'}

DECLARE @t DATETIME
SET @t = {ts '1992-04-30 23:59:59.123'}
试试这个:

declare @t DATETIME
set @t = '1992-04-30 10:54:30'

您认为这应该如何隐含地映射“92-04-31”->“1392-04-31”?您的回答没有明确说明是月还是日先到。此外,此日期格式将在另一个lanugage中失败。例如:SET LANGUAGE British go declare@t DATETIME SET@t='02-20-2013'PRINT@t在您给出的特定示例中,您的答案可能是正确的,但实际上会误导人们相信MM-DD-YYYY或DD-MM-YYYY是SQL中使用的安全格式。如果你读了我在下面提供的链接中的文章,下次你就不会犯这个错误了。不要把这当作个人问题,但我们都在这里学习,即使是那些回答问题的人。你不能在SQL中插入波斯语日期时间。你必须把它转换成朱利安。当您想在SQL中插入92-04-31时,这意味着您正在插入1992-04-31,我们在4月份有30天,然后您得到了错误。