2014-10-03 59 views
0

我正在将我的oracle数据库迁移到SQL Server。我需要一些帮助转换的这一行代码在我WHERE条款将TO_DATE从ORACLE转换为SQL SERVER

TO_DATE(TBL_TMX_ATTEMPT.LSTUPD) > (SYSDATE - '5') 
+0

'SYSDATE - '5''并不是一个好的风格。 “5'''是一个字符文字,而不是一个数字。你应该总是使用正确的文字。 '5'是一个数字。顺便说一句:为什么你在'varchar'列中存储日期?如果你正在迁移,你应该有机会使用正确的数据类型并将它存储在'date'或'datetime'列中。在字符列中存储日期是一个非常糟糕的选择。 – 2014-10-03 15:17:51

+0

@a_horse_with_no_name无论如何,我应该认为“日期-5”是糟糕的形式。你减去5什么?天?月?年份?我猜如果你长期与甲骨文合作,你可能会知道,但不是每个人都会。最好说清楚。在一个侧面说明中,当我看到'LSTUPD'时,我忍不住想它应该读取,“L-stupid”。 – jpmc26 2014-10-03 16:17:20

+1

@ jpmc26:'date-5'的含义在甲骨文(现在是几天)中有很好的定义和记录。在其他DBMS中也是如此(Postgres,Firebird,H2也是这样工作的)。但我同意:使用标准时间间隔'日期 - 间隔'5'日'可能更清晰,更便携。 – 2014-10-03 16:36:29

回答

0

你可以这样做:

WHERE CONVERT(DATETIME,TBL_TMX_ATTEMPT.LSTUPD) > GETDATE()-5

如果LSTUPD已经在日期时间,然后省略CONVERT()。如果它已经处于正确的格式,则无需运行转换。

还要记住GETDATE()包含一个时间戳记。所以这是当前日期/时间 - 5天。

如果你想获得午夜使用此5天前:

WHERE CONVERT(DATETIME,TBL_TMX_ATTEMPT.LSTUPD) > CONVERT(DATETIME,CONVERT(VARCHAR(10),GETDATE(),120))-5

+0

谢谢JiggsJedi,我用了第一个,但没有转换,它工作得很好。我忘了最终需要将日期转换为字符串的Oracle代码。我不需要在我的sql版本中执行该操作,只是运行查询 – 2014-10-03 15:35:26

+0

如果不使用字符串操作来删除时间,我会提高投票率。其他方法可以在这里找到:http://stackoverflow.com/questions/1177449/best-approach-to-remove-time-part-of-datetime-in-sql-server。 – jpmc26 2014-10-03 16:23:13

1
CONVERT(datetime,TBL_TMX_ATTEMPT.LSTUPD) > DATEADD(DAY,-5,GETDATE()) 
+0

+1用于明确单位。 – jpmc26 2014-10-03 16:22:23

0

知道TBL_TMX_ATTEMPT.LSTUPD的数据类型是什么是非常重要的。如果它是VARCHAR2或其他字符串类型(BAD选择存储日期,btw),则需要在SQL Server中调用CONVERT时考虑日期格式。查看CONVERT函数的Date/Time Style参数以获取更多信息。

CONVERT (data_type [ (length) ] , expression [ , style ])