我正在开发一个项目,其中日期和时间存储为varchar,例如" 30-11-2017,7:30"以dd-mm-yyy格式表示的第一个日期,然后用逗号分隔时间。我正在尝试对其进行过滤,但它无法正常工作,请指导我如何在日期过滤数据。
select *
from timetrack
where startDateAndTime >= '30-11-2017,7:30'
已显示附加图像记录。当我申请上述查询时,它显示没有记录
答案 0 :(得分:1)
您可以轻松地将日期转换为SQL数据类型datetime
uisng parse
函数,例如select parse('30-11-2017,7:30' as datetime using 'it-IT')
。
因此,在您的情况下,您可以在where
子句中应用此函数,以便您可以轻松地应用日期之间的比较:
select *
from timetrack
where parse(startDateAndTime as datetime using 'it-IT') >= '2017-11-30 07:30:00.000'
您的格式显然是意大利语:)但您必须以可转换为datetime
的格式指定您自己的日期,正如我在上面的示例中所做的那样。
注意:从SQL Management Studio 2012开始,parse
可用。
答案 1 :(得分:0)
除非您使用ISO日期格式(yyyy-MM-dd HH:mm:ss
或关闭),否则应用排序(大于或等于使用的不等式)将不起作用:日期顺序与字符串排序断开连接。
您需要将日期和时间解析为实际日期时间类型,然后与之进行比较(具体取决于您使用的是哪种RDBMS)。
答案 2 :(得分:0)
如果您想过滤掉日期,那么您可以使用convert()
函数进行SQL Server
select *
from timetrack
where startDateAndTime >= convert(date, left(@date, 10), 103)
否则将其转换为日期时间,如下所示
select *
from timetrack
where startDateAndTime >= convert(datetime, left(@date, 10)+' ' +
reverse(left(reverse(@date), charindex(',', reverse(@date))-1)), 103)
答案 3 :(得分:0)
首先,您需要检查在'startDateAndTime'列中输入的数据是什么,然后您可以将该varchar转换为日期格式
如果'startDateAndTime'
列中的数据包含'30-11-2017,07:30'
等数据,则必须将其转换为日期:
SELECT to_date('30-11-2017,07:30','dd-mm-yyyy,hh:mm') from dual; --check this
- 您的查询:
SELECT to_date(startDateAndTime ,'dd-mm-yyyy,hh:mm') from timetrack;
答案 4 :(得分:0)
您需要datetime列中的日期,否则您无法使用当前的varchar格式过滤日期。
在不更改现有列的情况下,可以通过创建计算列并使其保持不变来优化性能来实现。
ALTER TABLE test add CstartDateTime
as convert(datetime, substring(startDateAndTime, 7,4)+ substring(startDateAndTime, 4,2)
+ left(startDateAndTime, 2) +' '+ right(startDateAndTime, 5), 112) persisted
注意:这要求列中的所有行都包含具有当前格式的有效日期