2009-12-17 93 views
38

可能重复:
Create a date with T-SQLSQL服务器:转换((INT)年,(INT)个月,(INT)天),以日期时间

我已经存储的每个数据表年,月,日值作为整数:

year | month | day 
2009 | 1 | 1 
2008 | 12 | 2 
2007 | 5 | 5 

我需要将其转换为datetime值,因为我需要在操作之间的日期时间使用它。我怎么能这样做?

+0

这已经被问了几次。请参阅http://stackoverflow.com/questions/266924/create-a-date-with-t-sql – womp 2009-12-17 19:11:38

回答

64

为了独立的语言和区域设置,您应该使用ISO 8601 YYYYMMDD格式 - 这将任何SQL Server系统上运行的任何语言和区域设置生效:

SELECT 
    CAST(
     CAST(year AS VARCHAR(4)) + 
     RIGHT('0' + CAST(month AS VARCHAR(2)), 2) + 
     RIGHT('0' + CAST(day AS VARCHAR(2)), 2) 
    AS DATETIME) 
+0

谢谢,我也是这么做的。 – balint 2009-12-17 19:21:33

+1

YYYYMMDD像魔术一样工作! – LaBracca 2014-10-13 13:07:54

+0

虽然不适用于Firebird 2.5,但只有'YYYY-MM-DD'确实 – Fr0sT 2014-10-30 12:56:35

2
SELECT CAST(CAST(year AS varchar) + '/' + CAST(month AS varchar) + '/' + CAST(day as varchar) AS datetime) AS MyDateTime 
FROM table 
+4

这是一个坏主意 - 这取决于您的日期格式的本地设置。 – 2009-12-17 19:09:55

+1

@marc_s理解,但取决于您的部署需求,它可能是一个静音点。 – 2009-12-17 19:48:46

+2

naw。如果是一次即席查询,我可以看到你的观点。但不是在存储过程中。 marc_s有一个好点! – TamusJRoyce 2014-06-11 19:34:37

7

你可以自己的价值观转换成“十进制”日期时间,然后将其转换为一个真正的日期时间列:

select cast(rtrim(year *10000+ month *100+ day) as datetime) as Date from DateTable 

here以及更多信息。

+0

这是最好的答案 – 2017-12-05 10:29:20

36

纯日期时间的解决方案,不依赖于语言或DATEFORMAT,没有串

SELECT 
    DATEADD(year, [year]-1900, DATEADD(month, [month]-1, DATEADD(day, [day]-1, 0))) 
FROM 
    dbo.Table 
+0

这确实需要使用1900作为基准日期来配置SQL,虽然 – 2017-12-05 10:27:13

+0

@AdriaanDavel SQL Server(问题标签)是* always * base date 01 Jan 1900 。https://docs.microsoft.com/en-us/sql/t-sql/data-types/date-transact-sql请参阅“默认值”。 – gbn 2017-12-05 21:39:58