2011-08-25 154 views
18

我有一个奇怪的情况,我已经采用了SQL Server 2008的一个实例。SQL Server 2008设置DateTime变量

据我所知,至少它可以做到奇怪的事情DateTime这不是我所期望的!无论我使用什么日期格式,似乎都不想让我设置DateTime变量。

当我执行:

DECLARE @Test AS DATETIME 
SET @Test = 2011-02-15 
PRINT @Test 

我得到的输出:

Jun 18 1905 12:00AM 

我有点TSQL小白,很抱歉,如果这是简单的东西,但它让我难倒!我敢肯定我错过了一些非常明显的东西...

我已经检查了所有我能找到的区域设置&这一切看起来都没问题。我也尝试将DateTime设置为各种文字替代方案,例如'15/02/2011','2011-02-15 00:00:00'等。

我很想学习更多关于这一点,所以请后,你觉得可以与你的答案:)

由于沿有帮助的任何链接

回答

23

你需要在引号中的日期时间值:

DECLARE @Test AS DATETIME 

SET @Test = '2011-02-15' 

PRINT @Test 
+1

如果您发布的代码,XML或数据样本,** **请在高亮文本编辑器的线,然后点击“代码(编辑器)工具栏上的“样本”按钮(“{}”),以精确地格式化和语法突出显示它! –

3

2011-01-15 = 2011-16 = 1995。这则隐含地从一个整数转换为日期,给你第一千九百九十五天,从1月1日1900年

开始你需要使用SET @test = '2011-02-15'

+0

很酷,谢谢Dems。以为我在做一些愚蠢的事! – Bob

9

首先的 - 用你的周围日期文字单引号!

其次,我强烈建议您始终使用ISO-8601日期格式 - 无论您的语言环境,区域或语言设置在SQL Server上如何,都可以使用。

ISO-8601 format可以是:

  • YYYYMMDD的日期仅(例如,对于八月25日20110825,2011)
  • YYYY-MM-DDTHH:MM:SS用于日期和时间(例如2011-08-25T14:15:00八月25日,14:15/2:15pm下午)
5

尝试使用,而不是打印选择

DECLARE @Test AS DATETIME 

SET @Test = '2011-02-15' 

Select @Test 
0

你应该试试这样说:

DECLARE @TEST DATE 
    SET @TEST = '05/09/2013' 
    PRINT @TEST 
0
1. I create new Date() and convert her in String . 
2. This string I set in insert. 

**Example:** insert into newDate(date_create) VALUES (?)"; 

... 
PreparedStatement ps = con.prepareStatement(CREATE)) 
     ps.setString(1, getData()); 
     ps.executeUpdate(); 
    ...} 

    private String getData() { 
     SimpleDateFormat sdf = new SimpleDateFormat("yyyy-M-dd hh:mm:ss"); 
    return sdf.format(new java.util.Date()); 
    } 

**It is very important format** = "yyyy-M-dd hh:mm:ss" 
2

只是为了解释:

2011-02-15是从字面上解释为数学运算,其答案是1994

然后,这被解释为自日期起源(1900年1月1日)起的1994天。

1994天= 5年,6个月,18天= 1905年6月18日

所以,如果你不想给你想要比较日期为特定值使用标准每次计算:日期对象的toString()函数的值进行比较,以这样的字符串:

set @TEST ='2011-02-05'