我的表中有一个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
我得到的错误是
从字符串转换日期和/或时间时转换失败。
感谢您的帮助。
答案 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');