Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sql中的日期时间搜索_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

sql中的日期时间搜索

sql中的日期时间搜索,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我必须从具有上述条件的表中获取记录。。 然而,我的学习日期标准是满的,但开始时间标准不是满的。 这就是记录无法从表中获取的原因。。 我该怎么办 我不明白为什么要将日期字段存储为varchar 将开始时间字段强制转换为日期时间时,其表示形式为YYYY-MM-DD HH:MM:SS.mmm 因此,您无法将铸造字段与19:12:01进行比较,但必须使用time-part-DATEPART函数,然后您将与常量19:12:01进行比较 我见过你的小提琴。不能将值11:30:00强制转换为datetime

我必须从具有上述条件的表中获取记录。。 然而,我的学习日期标准是满的,但开始时间标准不是满的。 这就是记录无法从表中获取的原因。。
我该怎么办

我不明白为什么要将日期字段存储为varchar

将开始时间字段强制转换为日期时间时,其表示形式为YYYY-MM-DD HH:MM:SS.mmm

因此,您无法将铸造字段与19:12:01进行比较,但必须使用time-part-DATEPART函数,然后您将与常量19:12:01进行比较

我见过你的小提琴。不能将值11:30:00强制转换为datetime

解决方案A:更改已通知的字段类型 解决方案B:将您的值作为字符串进行比较,因为格式良好的字符串未被通知
在您的示例中,“11:30:00”在转换为datetime时并不大于或等于“19:12:01”,但这并不重要。 按照人们的建议做——将日期存储为datetime,不要使用varchars

Upd:

好的,如果您不能更改您的桌子:

SELECT STUDY_DATE,START_TIME,END_TIME
FROM STUDY
WHERE CAST(STUDY_DATE + 'T' + START_TIME  AS DATETIME)  >='2013-12-22T19:12:01'
     AND CAST(STUDY_DATE + 'T' + END_TIME  AS DATETIME) <='2013-12-23T13:12:14'

虽然在这种情况下最好使用适当的数据类型datetime,但如果您不能更改此字段的数据类型,则可以为持久化字段添加甚至创建索引

CREATE TABLE #STUDY
(
  [ID][INT],
  STUDY_DATE VARCHAR(40),
  START_TIME VARCHAR (40),
  END_TIME VARCHAR (40),
  START_DATETIME AS CAST(REPLACE(STUDY_DATE,'-','')+' '+START_TIME as datetime),
  END_DATETIME AS CAST(REPLACE(STUDY_DATE,'-','')+' '+END_TIME as datetime)
)

INSERT INTO #STUDY VALUES(1,'2013-12-23','11:30:00','11:31:00')


SELECT STUDY_DATE,START_TIME,END_TIME
FROM #STUDY
WHERE START_DATETIME >='20131222 19:12:01'
AND END_DATETIME <='20131223 13:12:14'


drop table #STUDY 

为什么使用VARCHAR列存储日期?哪个SQL Server版本?SQL Server 2008……从SQL Server 2008开始,您可以使用日期和时间数据类型。首先,您必须使用日期和时间类型,而不是使用VARCHAR来存储日期和时间值。然后,开始时间值(例如“19:12:01”)不应小于结束时间值(例如“13:12:14”)?Joe我的查询应该如何?我在解决方案A中写道:更改字段类型。因此,此时使用DATEPART函数检索时间信息无法将数据类型varchar更改为datetimewell,因此必须将研究日期+开始时间和研究日期+结束时间一起转换为datetimei。我还强烈建议使用date,时间或datetime数据类型的一列,您永远不会陷入这样的混乱。请参见其中castSTUDY_DATE as DATE>=cast'2013-12-22'as DATE,CASTSTART_time as time>=cast'19:12:01'as time for other。
CREATE TABLE #STUDY
(
  [ID][INT],
  STUDY_DATE VARCHAR(40),
  START_TIME VARCHAR (40),
  END_TIME VARCHAR (40),
  START_DATETIME AS CAST(REPLACE(STUDY_DATE,'-','')+' '+START_TIME as datetime),
  END_DATETIME AS CAST(REPLACE(STUDY_DATE,'-','')+' '+END_TIME as datetime)
)

INSERT INTO #STUDY VALUES(1,'2013-12-23','11:30:00','11:31:00')


SELECT STUDY_DATE,START_TIME,END_TIME
FROM #STUDY
WHERE START_DATETIME >='20131222 19:12:01'
AND END_DATETIME <='20131223 13:12:14'


drop table #STUDY