我有一个数据库,它有date_col在varchar形式。我对数据库只有只读权限,不能修改数据库的结构。我想找出2020年6月和12月之间的所有表项。
我已经尝试了下面的查询,但它不工作。
SELECT *,CONVERT(VARCHAR, DATE_col, 101) as DATE_col_date
FROM DW.table_name
where DATE_col_date between '2020-01-06' and '2020-31-12'
Name ID DATE_col Place
A 1 01/12/2020 P1
B 2 01/06/2020 P1
C 3 01/01/2020 P1
D 4 01/04/2020 P1
E 5 01/11/2020 P1
F 6 01/08/2020 P1
预期输出
Name ID DATE_col_date Place
A 1 01/12/2020 P1
B 2 01/06/2020 P1
E 5 01/11/2020 P1
F 6 01/08/2020 P1
误差
列名'DATE_col_date '无效。
最好的长期解决方案是使您的DATE_col
成为真正的日期/时间戳类型列。话虽如此,如果你必须应付你目前的设计,那么考虑下面的答案。
在比较文本日期列和日期字面值时,应该在WHERE
子句中调用CONVERT
。此外,使用YYYYMMDD
日期文字格式可以明确表示您的意思:
SELECT *
FROM DW.table_name
WHERE CONVERT(DATE, DATE_col, 101) >= '20200106' AND
CONVERT(DATE, DATE_col, 101) < '20210101';
注意,如果你使用的是最新版本的SQL Server,你也可以在这里使用TRY_CONVERT
:
TRY_CONVERT(DATE, DATE_col)
此外,我在WHERE
子句中表达了逻辑,以包括从2020年1月6日开始的所有日期,直到2020年底。这似乎就是你想要的。
SELECT *, CONVERT(DATE, DATE_col, 101) as DATE_col_date
FROM TABLE_NAME
WHERE CAST(DATE_col AS DATE) between CAST('2020-01-06' AS DATE) and CAST('2020-12-31'AS DATE)
试试这个就行了。