SQL Server:将varchar字段转换为日期

时间:2018-10-17 21:42:15

标签: sql sql-server

我的表中有一个Foo列,其中包含日期,格式为dd-MM-yyyy

varchar

我需要编写一个基于日期的查询,该查询获取2019年1月1日之前的所有日期。 我已经尝试过同时使用31-12-2018 01-01-2019 02-01-2019 CAST来转换这些表值而没有运气。

使用CONVERT,我的代码如下:

CAST

使用转换

SELECT
    CAST('''' + SUBSTRING(arc_billed_to_date, 4, 2) + '-' + SUBSTRING(arc_billed_to_date, 1, 2) + SUBSTRING(arc_billed_to_date, 6, 5)+ '''' AS date), 
    CAST('''' + SUBSTRING(arc_billed_to_date, 7, 5) + '-' + SUBSTRING(arc_billed_to_date, 1, 2) + '-' + SUBSTRING(arc_billed_to_date, 4, 2) + '''' AS date),
    CAST('''' + SUBSTRING(arc_billed_to_date, 7, 5) + '-' + SUBSTRING(arc_billed_to_date, 4, 2) + '-' + SUBSTRING(arc_billed_to_date, 1, 2) + '''' AS DATE), 
    CONVERT(DATE, '12-31-2018') AS x 
FROM
    wkpol

我得到的错误是

  

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

感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

好吧,使用varchar字段作为日期会引起很多责备。无论如何,假设这是另一个线程的问题,您可以执行如下转换:

select * from myTable
where cast(right(arc_billed_to_date,4) + 
substring(arc_billed_to_date,4,2) +
left(arc_billed_to_date,2) as date) < '20190101';

您也不会使用任何索引。

答案 1 :(得分:2)

除了Sean的评论,您还可以将DateFormat设置为DMY

示例

Declare @YourTable table (SomeCol varchar(50))
Insert Into @YourTable values
 ('31-12-2018')
,('01-01-2019')
,('02-01-2019')

Set DateFormat DMY

Select AsDate = try_convert(date,SomeCol)
 From  @YourTable

返回

AsDate
2018-12-31
2019-01-01
2019-01-02

答案 2 :(得分:2)

SELECT  *
FROM wkpol
WHERE convert(date, arc_billed_to_date, 103) < convert(date, '01/01/2019');