sql - SQL SERVER 2008 R2 中无效日期的 DATE 与 DATETIME 转换

标签 sql date datetime sql-server-2008-r2

因此,虽然我认识到日期格式等应该在表示层中完成,但我很想知道是否有人已经看到或认识到这种差异(如果愿意,请在家尝试)我有点困惑,主要是好奇,首先是示例代码。

更新:为了根据最初的回复进行澄清,我知道日期无效或更好地“不安全”,因为我更普遍关注的特定字段来自用户输入。”也就是说,虽然我知道验证/formatting 不是 SQL 2008 的强项,至少让我好奇的是 DATETIME 更宽容,我想知道如何导致看到 有多宽容 。”

DECLARE @RawValue NVARCHAR(30), @Value DATETIME;
SET @RawValue = '01/20.1901'

SET @Value = CAST(@RawValue AS DATETIME)
PRINT @Value

这会为我的服务器设置生成正确的结果: 1901 年 1 月 20 日上午 12:00

但是,如果倒数第二行更改为(用 DATE 替换 DATETIME):
  SET @Value = CAST(@RawValue AS DATE)

Msg 241, Level 16, State 1, Line 8
从字符串转换日期和/或时间时转换失败。

里面有解释吗?需要明确的是,我是否将 @Value 声明为 DATE 或 DATETIME 甚至 NVARCHAR 都无关紧要——结果相同。错误消息似乎表明它在转换日期 时遇到问题和/或 时间,为什么 DATETIME 的行为会有所不同?

谢谢,

最佳答案

值得一提的是,DATE 和 DATETIME 是完全不同的数据类型。 DATE 不仅仅是删除了时间的 DATETIME。例如, CAST('17520910' AS DATE) 有效,而类似的 DATETIME 转换则无效。对于历史爱好者来说,英格兰或她的殖民地没有这样的日子,日历从 9 月 2 日跳过到 9 月 14 日。与 DATETIME 不同,DATE 回到第 1 年而不考虑日历系统。

另一个重要区别是缺少将天数直接添加到日期的隐式类型转换。如果 D 是日期时间,则 D+3 是三天后的日期。如果 D 是 DATE,则 D+3 会产生错误。

我假设因为隐式转换的新代码是为 DATE 从头开始​​创建的,所以微软只是让它变得更加挑剔。

关于sql - SQL SERVER 2008 R2 中无效日期的 DATE 与 DATETIME 转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20510261/

相关文章:

regex - 日期的正则表达式(月 dd , yyyy)

python - 将 pandas 时间序列加入日期范围

java - DateTimeFormatter 中的格式化程序用于 ISO 8601 时间日期格式

sql - 获取多行相等的人(Oracle SQL)

mysql - 如何在删除语句中使用 Sum 和 Inner Join 并向其中添加第三个表

mysql - 行作为 MySQL 中的列

mysql - 如何合并两个连接表中的行?

Excel VBA : vlookup to find row of date in date range table

android - 如何获取Android手机的当前日期?

python - 猜测Python中许多格式相同的日期的日期格式