将 varchar 转换为 datetime 以对日期进行排序?

Posted

技术标签:

【中文标题】将 varchar 转换为 datetime 以对日期进行排序?【英文标题】:Convert varchar to datetime to sort date? 【发布时间】:2019-07-05 02:42:03 【问题描述】:

我想尝试对日期进行排序,但有一些限制,因为这些列是 varchar。

现有数据

这是我测试的查询。

SELECT        PERIODE, RF, APPROVE_DATE
FROM            DLY_UPGRADE
WHERE        (SLP = '368') AND (CONVERT(datetime, APPROVE_DATE, 101) > '01/01/2017')

错误信息:

【问题讨论】:

你为什么首先使用 varchar 来存储日期? 【参考方案1】:

如果您使用的是 SQL Server,请尝试以下操作:

SELECT        PERIODE, RF, APPROVE_DATE
FROM            DLY_UPGRADE
WHERE        (SLP = '368') AND (CONVERT(date, APPROVE_DATE, 103) > '2017-01-01')

【讨论】:

【参考方案2】:

使用

 DATE_FORMAT(STR_TO_DATE(`APPROVE_DATE`, '%d/%m/%Y'), '%Y-%m-%d')

从字符串中更改日期,然后与Y-m-d 格式进行比较

 SELECT        PERIODE, RF, APPROVE_DATE
 FROM            DLY_UPGRADE
 WHERE        (SLP = '368') AND (DATE_FORMAT(STR_TO_DATE(`APPROVE_DATE`, '%d/%m/%Y'), '%Y-%m-%d')) > '2017-01-01')

【讨论】:

感谢您对类似案例的帮助。 :)【参考方案3】:
SELECT        PERIODE, RF, APPROVE_DATE, cast(PERIODE as datetime) as PERIODEDatetime
FROM            DLY_UPGRADE
WHERE        (SLP = '368') AND (CONVERT(datetime, APPROVE_DATE, 101) > '01/01/2017')
order by PERIODEDatetime asc

在这里,您可以将您的 varchar 转换为 datetime 并使用它在 asc/desc 中订购。 APPROVE_DATE 也是如此。

【讨论】:

【参考方案4】:

您的转换问题似乎出现在WHERE 子句中。但是,在继续查询之前,我会使用TRY_CONVERT() 进行测试:

select approve_date
from dly_upgrade
where slp = '368' and approve_date is not null and
      try_convert(date, approve_date, 103) is null;

101 的样式为 MM/DD/YYYY,因此 '15/11/2016' 将失败,因为 15 不是有效月份。 103 是 DD/MM/YYYY,这似乎是你想要的。

假设这在列中没有返回意外值,我建议:

SELECT PERIODE, RF, APPROVE_DATE
FROM  DLY_UPGRADE
WHERE SLP = '368' AND
      TRY_CONVERT(datetime, APPROVE_DATE, 103) > '2017-01-01'
ORDER BY ?  -- not sure if you want PERIOD or TRY_CONVERT(datetime, APPROVE_DATE, 103)

【讨论】:

谢谢我的问题已经解决了。我只需要用01-01-2017调整日期格式101代码

以上是关于将 varchar 转换为 datetime 以对日期进行排序?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 DateTime 转换为 VarChar

完全按原样将 Datetime 转换为 Varchar

将 varchar 转换为 datetime 并添加秒

将 varchar 数据类型转换为 datetime 数据类型导致值超出范围的问题

Polybase - 将数据类型 VARCHAR 转换为 DATETIME 时出错

将 varchar 2007-12-19-11.57.1​​7.366731 转换为 datetime 数据类型