在sqlserver.txt中使用日期限制查询字符串类型的列

时间:2010-12-08 02:52:08

标签: sql-server sql-server-2005

我有一个sql表,其create sql显示如下:

++++++++++++++++++++++++++++++++++++++++++++++++++++

USE [TestDB]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Test](
    [LogTime] [nvarchar](50) NULL,
    [EventTime] [nvarchar](50) NULL,
    [value] [nvarchar](50) NULL,
) ON [PRIMARY]
GO

// +++++++++++++++++++++++++++++++++++++++++++++

但是,当我从表中选择数据时,这就是值。

LogTime                         EventTime            value
--------------------------------------------------------------------
2010-11-26 12:10:31.907000000   634263264000000000   1.145604E-10
2010-11-26 12:10:31.907000000   634263264000000000   1.373898E-9
2010-11-26 12:10:31.907000000   634263264000000000   -2.3787419E-10

为什么Eventtime不是日期格式?

另外,我需要根据日期来从表中选择一些东西,例如获取其事件时间在“2010-10-12 12:00:00”和“2010-10-12 17:00:00”之间的dat ,那么如何构建sql单词?

BWT,我无法改变表的结构,我只需要从db读取数据,永远不要写。

**

  

更新:

**

其中一种sql日期格式为:

YYYY-MM-DD HH:MI:SS.MMM(24h)    ODBC Canonical (with milliseconds)  SELECT CONVERT(VARCHAR(23), GETDATE(), 121)     1972-02-19 06:35:24.489

但为什么我桌子上的日期毫秒数是9?

像:

1972-02-19 06:35:24。 489

我的数据:2010-11-26 12:10:31。 907000000

我想删除毫秒,那么如何在sql word中转换它?

2 个答案:

答案 0 :(得分:0)

如果可以,请将eventTime更改为datetime数据类型而不是varchar

答案 1 :(得分:0)

根据您为EventTime显示的当前值,我认为您需要向负责填充此表的任何人(因为您已表明它不是您的代码)进行澄清,数据的格式是什么在EventTime栏中。

目前,我不知道任何特定的SQL日期时间格式可以将此信息表示为您能够处理所需WHERE条件的日期。

List of common SQL Date formats

此外,我建议如果可能的话,发布负责填充Test表的代码,因为这可能会给EventTime列中的数据(及其格式)提供一些指示。

编辑:根据评论,数据似乎存储在数据库中的正确日期(尽管是字符串格式)。如果是这种情况,则以下情况应该有效。

注意:121是包含毫秒的格式。如果您的日期不需要毫秒

,您也可以选择使用120
SELECT LogTime, CONVERT(DateTime, eventTime, 121), value 
FROM Test
WHERE CONVERT(DateTime, eventTime, 121) BETWEEN 
    CONVERT(DateTime, '2010-10-12 12:00:00', 121) AND 
    CONVERT(DateTime, '2010-10-12 17:00:00', 121) 

注意:您可以通过仅执行一次并将其存储在datetime变量中来避免2个硬编码值(可能是params)上每行的转换。 此外,根据definition,BETWEEN包含两个边界。