在sql中存储为varchar的日期时间如何在varchar上过滤

时间:2018-01-24 10:54:50

标签: sql sql-server

enter image description here

我正在开发一个项目,其中日期和时间存储为varchar,例如" 30-11-2017,7:30"以dd-mm-yyy格式表示的第一个日期,然后用逗号分隔时间。我正在尝试对其进行过滤,但它无法正常工作,请指导我如何在日期过滤数据。

select *
from timetrack
where startDateAndTime >= '30-11-2017,7:30'

已显示附加图像记录。当我申请上述查询时,它显示没有记录

5 个答案:

答案 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

注意:这要求列中的所有行都包含具有当前格式的有效日期