Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server查询,将收集不充分的日期转换为可用于分析年龄的可用日期_Sql_Sql Server_Sql Server 2008_Date - Fatal编程技术网

SQL Server查询,将收集不充分的日期转换为可用于分析年龄的可用日期

SQL Server查询,将收集不充分的日期转换为可用于分析年龄的可用日期,sql,sql-server,sql-server-2008,date,Sql,Sql Server,Sql Server 2008,Date,我有一个名为“出生日期”的日期字段,出生日期记录如下: YYYYMMDD,其中缺少该年的第二个数字 例如,1978年3月4日的出生日期在这个字段中显示为:1780304 此字段中的规则是,如果以“1”开头,则日期为1900年代,如果以“2”开头,则日期为2000年代 所以我想做的是创建另一列,显示正确书写的日期版本,这样我就可以从中计算年龄 e、 g 列1称为BIRTH_DAT,其值为: 1801204116012281980803 第2列是一个名为property_DOB的新列,其值为: 19

我有一个名为“出生日期”的日期字段,出生日期记录如下:

YYYYMMDD,其中缺少该年的第二个数字

例如,1978年3月4日的出生日期在这个字段中显示为:1780304

此字段中的规则是,如果以“1”开头,则日期为1900年代,如果以“2”开头,则日期为2000年代

所以我想做的是创建另一列,显示正确书写的日期版本,这样我就可以从中计算年龄

e、 g

列1称为BIRTH_DAT,其值为: 1801204116012281980803

第2列是一个名为property_DOB的新列,其值为: 198012041960122819980803

我该怎么做?

原始答案-帖子被标记为MySQL:

使用CASE表达式并使用left、substring和concat函数对字符串进行操作将得到派生的结果。根据我们要替换的第一个字符:

1对19 2对20 对于第一个字母不是1,2的任何其他情况,我们将打印不支持的日期格式:

正如@Siyual和@Jandogen所建议的,您的列的正确格式应该是DATE,您可以通过使用str_to_DATE函数使用指定格式转换字符串来实现,如下所示:

select
  birth_dat,
  case 
    when left(birth_dat,1) = '1' then str_to_date(concat('19', substring(birth_dat from 2)), '%Y%m%d')
    when left(birth_dat,1) = '2' then str_to_date(concat('20', substring(birth_dat from 2)), '%Y%m%d')
    else 'unsupported date format'
    end AS proper_dob
from yourtable
两个查询的实时示例:

原来OP使用的是SQL Server,下面是经过编辑的答案:

由于SQL Server中没有str_to_date函数,因此使用可实现相同的功能。

用于在另一个字符串值中插入字符串

SELECT *,
       YEAR(GETDATE())-YEAR(PROPER_DATE) AS Age,
       CASE WHEN YEAR(GETDATE())-YEAR(PROPER_DATE) < 19 THEN '0-19y' ELSE '20y+' END AS AGE_GROUP
FROM(
    SELECT BIRTH_DAT, 
          CASE WHEN CHARINDEX('1',BIRTH_DAT) = 1 THEN STUFF(CAST(BIRTH_DAT AS VARCHAR(30)),2,0,'9') 
          WHEN CHARINDEX('2',BIRTH_DAT) = 1 THEN STUFF(CAST(BIRTH_DAT AS VARCHAR(30)),2,0,'0') 
          END AS PROPER_DATE
    FROM my_table 
)M            

如果您正在修复格式不正确的数据,这很好!,为什么不实际使用正确的日期数据类型?提示:您需要CASE子句和SUBSTRING函数。这将是检查转换是否正常的良好第一步,让他先清理无效的出生日期,但OP想把它放到一个新的栏中,正如Siyual评论的那样,应该是日期类型。@Jandogen感谢您的输入,我编辑了我的答案以提供更多关于这个问题的见解。嗨@Kamil-G-我从错误行4中得到了“关键字附近的语法不正确”-因此第一个concatline@sseager我提供了一个SQL小提琴-一切正常。是否有可能您没有使用您定义的MySQL?我也尝试过调整查询以显示起始位置和字符数,但错误是“STR_to_DATE”不是可识别的内置函数名现在可以对我的年龄进行分组吗?e、 g.如果年龄介于0和19之间,那么“0-19y”表示为“20y+”?一个名为“年龄组”的新列将我们从重新格式化的日期字段计算出的每个单一年龄放入年龄组OK,那么最后一个请求-我现在如何计算每个计算年龄组的不同ID数此ID字段称为PERSON_REF?很明显,我在查询中没有将其放在正确的位置,因为我不断出现错误。您是否在查找组的id计数,其中组可以是“0-19y”和“20y+”?如您所见,我已更改了我的组
SELECT *,
       YEAR(GETDATE())-YEAR(PROPER_DATE) AS Age,
       CASE WHEN YEAR(GETDATE())-YEAR(PROPER_DATE) < 19 THEN '0-19y' ELSE '20y+' END AS AGE_GROUP
FROM(
    SELECT BIRTH_DAT, 
          CASE WHEN CHARINDEX('1',BIRTH_DAT) = 1 THEN STUFF(CAST(BIRTH_DAT AS VARCHAR(30)),2,0,'9') 
          WHEN CHARINDEX('2',BIRTH_DAT) = 1 THEN STUFF(CAST(BIRTH_DAT AS VARCHAR(30)),2,0,'0') 
          END AS PROPER_DATE
    FROM my_table 
)M            
SELECT *,YEAR(GETDATE())-YEAR(PROPER_DATE) AS Age, 
CASE 
WHEN YEAR(GETDATE())-YEAR(PROPER_DATE) < 5 THEN '0-5Y'
WHEN YEAR(GETDATE())-YEAR(PROPER_DATE) BETWEEN 5 AND 9 THEN '5-9Y'
WHEN YEAR(GETDATE())-YEAR(PROPER_DATE) BETWEEN 10 AND 14 THEN '10-14Y'
WHEN YEAR(GETDATE())-YEAR(PROPER_DATE) BETWEEN 15 AND 19 THEN '15-19Y'
WHEN YEAR(GETDATE())-YEAR(PROPER_DATE) >= 20 THEN '20+Y'
ELSE 'NK'
END AS AGE_GROUP,
COUNT(*)
FROM(
SELECT BIRTH_DAT 
,SEX
,CASE 
WHEN CHARINDEX('1',BIRTH_DAT) = 1 THEN STUFF(CAST(BIRTH_DAT AS VARCHAR(10)),2,0,'9') 
WHEN CHARINDEX('2',BIRTH_DAT) = 1 THEN STUFF(CAST(BIRTH_DAT AS VARCHAR(10)),2,0,'0') 
END AS PROPER_DATE
FROM mytable
)M
GROUP BY (CASE 
WHEN YEAR(GETDATE())-YEAR(PROPER_DATE) < 5 THEN '0-5Y'
WHEN YEAR(GETDATE())-YEAR(PROPER_DATE) BETWEEN 5 AND 9 THEN '5-9Y'
WHEN YEAR(GETDATE())-YEAR(PROPER_DATE) BETWEEN 10 AND 14 THEN '10-14Y'
WHEN YEAR(GETDATE())-YEAR(PROPER_DATE) BETWEEN 15 AND 19 THEN '15-19Y'
WHEN YEAR(GETDATE())-YEAR(PROPER_DATE) >= 20 THEN '20+Y'
ELSE 'NK'
END