【问题标题】:Need to convert VARCHAR(10) using MMMDD string into a DATE in SQL需要将使用 MMMDD 字符串的 VARCHAR(10) 转换为 SQL 中的 DATE
【发布时间】:2016-08-26 14:23:43
【问题描述】:

我正在制作一份报告,显示部门当月的生日,出于某种原因,他们决定在表格中使用 VARCHAR(10) 作为员工的生日。

虽然我可以使用 VARCHAR 获取我需要的信息,但我无法在 Tableau 中按当前月份进行筛选,因为它无法将数据识别为实际日期。

所以我需要将使用 MMMDD 字符串的 VARCHAR(10) 转换为 SQL 中的 DATE。我知道如果没有年份,它永远不会是有效日期,但年份对我的报告并不重要,因此可以应用通用年份。

任何帮助都会很棒。 PeopleSoftData.birth_date 是 VARCHAR(10) 字段,数据字符串使用 MMMDD Ex:JAN18 没有一年,所以我在使用网站上预先存在的问答转换为 DATE 时遇到了麻烦。

SELECT
    PeopleSoftData.fname+' '+PeopleSoftData.lname AS 'Full Name',
    PeopleSoftData.fname AS 'First Name',
    PeopleSoftData.lname AS 'Last Name',
    PeopleSoftData.location AS 'Site',
    PeopleSoftData.birth_date AS 'Birth Date', -- This field is VARCHAR(10) and the data string is using MMMDD Ex:JAN18 without a year
    PeopleSoftData.orig_hire_date AS 'Hire Date',
    PeopleSoftData.supervisor_name AS 'Supervisor'

FROM dbo.USC_StatsApp_Members MemberList
    INNER JOIN dbo.USC_Reporting_PeopleSoft_Data PeopleSoftData ON (PeopleSoftData.empcontid = MemberList.empcontid)

WHERE 
    PeopleSoftData.termination_date IS NULL
    AND PeopleSoftData.birth_date IS NOT NULL
    AND MemberList.USC_Active = 1
    AND DATEDIFF(wk,MemberList.Last_seen_PeopleSoft,current_timestamp) < 2

【问题讨论】:

  • 别忘了将闰年作为通用年份。
  • 为什么还需要将其转换为日期?你只是想改变显示格式吗?
  • 对其执行日期函数....
  • @CharlesBretana 因为 OP 不关心年份,所以我很好奇哪些函数是相关的。 monthname()?
  • 我们使用 Tableau 来生成可视化报告,因为我需要在逻辑上按月份分隔生日,所以最好在 SQL 而不是 Tableau 中完成。我已经通知开发人员将该表转换为 DATETIME,因此我们不必这样做。

标签: sql date sql-server-2012 varchar


【解决方案1】:

也许这会有所帮助

select cast(concat('JAN18',' ',year(getdate())) as date)

返回 2016-01-18

【讨论】:

  • 谢谢,这让我得到了我需要的东西:CAST(CONCAT(PeopleSoftData.birth_date,' ',year(getdate())) as date) AS 'Birth Date',
  • 明年(2017 年)2 月 29 日将无法使用。坚持闰年,
  • @jarlh 你完全正确,默认年份应该是闰年。我看到了你的评论,也应该强调一下
【解决方案2】:

一种方式('FEB29' => '29FEB2016 => DATETIME):

select cast(right(birth_date, 2) + left(birth_date, 3) + '2016' as date)

2016-02-29

【讨论】:

  • 谢谢。由于 2016 年是闰年,这将有助于控制它!学习了不少!我是一个 SQL 新手,哈哈。
【解决方案3】:

只需将当前年份连接到它的开头并将其转换为日期

SELECT
   p.fname+' '+PeopleSoftData.lname AS 'Full Name',
   p.fname AS 'First Name',
   p.lname AS 'Last Name',
   p.location AS 'Site',
   cast(datename(year, getdate()) + p.birth_date as date) AS 'Birth Date', 
   p.orig_hire_date AS 'Hire Date',
   p.supervisor_name AS 'Supervisor'

FROM dbo.USC_StatsApp_Members m
    JOIN dbo.USC_Reporting_PeopleSoft_Data p
   ON p.empcontid = m.empcontid

WHERE p.termination_date IS NULL
   AND p.birth_date IS NOT NULL
   AND m.USC_Active = 1
   AND DATEDIFF(wk, m.Last_seen_PeopleSoft, current_timestamp) < 2

为了消除错误,您可以先测试...

SELECT
   p.fname+' '+PeopleSoftData.lname AS 'Full Name',
   p.fname AS 'First Name',
   p.lname AS 'Last Name',
   p.location AS 'Site',
   case When isDate(datename(year, getdate()) + p.birth_date) = 1 
        then cast(datename(year, getdate()) + p.birth_date as date)
        else null end AS 'Birth Date', 
   p.orig_hire_date AS 'Hire Date',
   p.supervisor_name AS 'Supervisor'

FROM dbo.USC_StatsApp_Members m
    JOIN dbo.USC_Reporting_PeopleSoft_Data p
   ON p.empcontid = m.empcontid

WHERE p.termination_date IS NULL
   AND p.birth_date IS NOT NULL
   AND m.USC_Active = 1
   AND DATEDIFF(wk, m.Last_seen_PeopleSoft, current_timestamp) < 2

【讨论】:

  • 哦,错过了。然后,呃,将 当前年份 连接到它......我将编辑我的答案。
猜你喜欢
  • 1970-01-01
  • 2020-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-23
  • 2020-07-01
  • 1970-01-01
  • 2015-09-04
相关资源
最近更新 更多