选择Varchar作为日期

时间:2014-05-24 14:41:54

标签: sql firebird

我想选择一个varchar字段作为日期字段

例如,字段的值为“30.12.2011 21:15:03”

当我选择这个

select DATE from TABLE where DATE = '30.12.2011'

我没有结果。

4 个答案:

答案 0 :(得分:1)

您要求获取时间戳字段的日期部分,但您的问题实际关于过滤在时间戳字段的日期。有一种更简单的方法可以实现:您可以使用以下知识:特定日期的所有可能时间戳都不会为它们之间的不同日期设置任何时间戳。

select DATE
from TABLE
where DATE >= '30.12.2011' and DATE < '31.12.2011'

您的编辑说明您根本没有时间戳字段。尽管如此,类似的方法仍然有效:

select DATE
from TABLE
where DATE LIKE '30.12.2011 %'

或Firebird特定的

select DATE
from TABLE
where DATE starting with '30.12.2011 '

答案 1 :(得分:1)

假设该字段是日期字段,请将DATE介绍人与yyyy-mm-dd结合使用(或TIMESTAMP及时)。

所以使用:

select datefield from sometable where datefield = DATE '2011-12-30'

从技术上讲,你可以不介绍介绍人,但根据SQL标准它是'correcter'。

假设TIMESTAMP字段,除非时间戳(始终)位于00:00:00.0000(在这种情况下它应该是DATE),否则您将无法获得结果。

要进行比较,您需要使用BETWEEN,例如:

select timestampfield from sometable 
where timestampfield BETWEEN '2011-12-30 00:00:00.0000' AND '2011-12-30 23:59:59.9999'

或将时间戳截断为日期(如果时间戳已编入索引,则可能会对性能产生负面影响,因为此时无法再使用索引),例如:

select timestampfield from sometable
where CAST(timestampfield AS DATE) = '2011-12-30'

如果日期存储在VARCHAR字段中(这本身就是一个坏主意),有几种解决方案,首先是将其作为日期操作来处理:

select varcharfield from sometable
where CAST(CAST(varcharfield AS TIMESTAMP) AS DATE) = '2011-12-30'

如果VARCHARFIELD中也有时间分量,则需要双重演员。这假设日期采用下面列出的支持格式。如果您使用上面的BETWEEN,则可以使用单个强制转换来添加时间戳

另一个解决方案(as suggested by hvd)将纯粹视为字符串操作,例如:

select varcharfield from sometable
where varcharfield STARTING WITH '30.12.2011'

如果要选择范围,则会出现一系列问题。底线:使用真实的TIMESTAMP字段!

请注意,Firebird支持多种格式:

  • yyyy-mm-dd,例如2014-05-25(ISO-8601格式,可能最好用,因为它可以减少混淆)
  • dd.mm.yyyy,例如25.05.2014
  • mm/dd/yyyy,例如05/25/2014
  • mm-dd-yyyy,例如05-25-2014
  • dd mmm yyyy,例如2014年5月25日(+ -./作为分隔符的变体)
  • mmm dd yyyy,例如2014年5月25日(+ -./的变体作为分隔符)

答案 2 :(得分:0)

从表格中选择DATE(日期为DATE)=&#39; 30.12.2011&#39;

日期字段是时间戳

答案 3 :(得分:-1)

以下是我的问题的答案:

CAST
(
SUBSTRING
(field FROM 1 FOR 2)
||'.'||
SUBSTRING
(field FROM 4 FOR 2)
||'.'||
SUBSTRING
(field FFROM 7 FOR 4)
AS DATE)

这花了我5个小时来找到它,也许应该有一个“ - ”而不是“。”但它确实有效。