【问题标题】:Get age between the current year and birthdate, gives **"Conversion failed when converting date and/or time from character string."**获取当前年份和生日之间的年龄,给出**“从字符串转换日期和/或时间时转换失败。”**
【发布时间】:2016-04-22 16:23:25
【问题描述】:

我需要从表 PERSON 和列 BIRTHDATE(varchar(8)) 中获取名称为 age >=70 的名称。

在我开始显示年龄 >=70 之前尝试此查询。

select DATEDIFF (year , person.BirthDate, GETDATE()) as Age, * from person

这个查询给出了

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

我该怎么做?我实在想不通。谢谢

【问题讨论】:

  • person.BirthDate中的日期格式是什么?
  • 您不能将 DATEDIFF 与 varchar 列一起使用。您必须将 varchar 转换/转换为日期时间/日期。
  • 你能提供一个行的样子或表架构的例子吗?
  • @cdm person.birthdate 是 varchar
  • 如果您将日期存储为varchar,那么您存储日期是错误的。此外,查询“此人的出生日期是否早于today - 70 years”比查找当前年满 70 岁或以上的人要容易得多(一旦您整理好您的转化)。尝试使用DATEDIFF 的问题在于它计算transitions。如果您使用明显的DATEDIFF 公式,12 月 31 日出生的人在 1 月 1 日是 1 岁。

标签: sql sql-server datediff


【解决方案1】:

您可以使用下面的查询

SELECT DATEDIFF( year , Convert( datetime,person.birthdate, 120 ), GETDATE() ) as Age FROM persons

这将首先将您的person.birthdate 列转换为日期,然后找出差异

【讨论】:

  • DATEDIFF 计算转换。它不能确定大多数人将什么定义为年龄。如果您在今年 1 月 1 日运行上述代码,对于生日为 20151231 的人,它将返回 1。大多数人不认为某人一天大为 1。
【解决方案2】:

出生日期列似乎是 varchar 数据类型。尝试将其转换为日期时间

SELECT 
    DATEDIFF (year , cast(person.BirthDate as datetime), 
    GETDATE()) as Age, * 
FROM 
    person

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-17
    • 2017-12-07
    相关资源
    最近更新 更多