在更大的sql子句中使用DatePart

时间:2012-01-31 19:36:20

标签: sql sql-server

此语句将正确合并2列('DATE'和'TIME')

update AllBW1 set sUserTime = 
    CAST(
    (
    STR( YEAR( [DATE] ) ) + '/' +
    STR( MONTH( [DATE] ) ) + '/' +
    STR( DAY( [DATE] ) ) + ' ' +
    (select DATENAME(hour, [TIME]))+ ':' +
    (select DATENAME(minute, [TIME])) + ':' +
    (select DATENAME(SECOND, [TIME]))
        ) as DATETIME)

    where sUserTime is null

我想改进上述内容,以便用我自己的(GMT-6)替换默认时区。

我尝试了一些变化:

    CAST((select DATEADD(hour, -6, DATENAME(hour, [TIME]))) as smalldatetime) + ':' +
and
    (select CAST(DATEADD(hour, -6, DATENAME(hour, [TIME]))) as datetime) + ':' +

并没有取得任何快乐。

THX

1 个答案:

答案 0 :(得分:0)

LogParser 2.2解析到SQL表中的日志文件具有单独的日期和时间字段,但由于两者都被格式化为数据时间字段,因此最终看起来像:

2012-01-04 00:00:00.000 for date (all time fields are zeroed)
2012-01-01 06:04:41.000 for time (all date field = first day of current year)

这就是查询按原样解析每个元素的原因。感谢Dems评论我简化了一切。我毫不怀疑这可以通过我正在处理的卷来进行优化,这是非常充分的:

update myTable set sUserTime = 
    (
    DATENAME(YEAR, [DATE] )  + '/' +
    DATENAME(MONTH, [DATE]  ) + '/' +
    DATENAME(DAY, [DATE] )  + ' ' +
    DATENAME(hour, (dateadd(hh, -6, [time])))+ ':' +
    DATENAME(minute, [TIME]) + ':' +
    DATENAME(SECOND, [TIME])
        ) 

    where sUserTime is null