MSSQL / ASP日期格式英国日期时间问题

时间:2013-05-07 10:51:21

标签: sql sql-server sql-server-2008 asp-classic

解释起来非常复杂,所以我提前道歉。我在英国,所以这与英国的日期时间格式有关。

我有一个提交到ASP页面的VBS,然后将其插入带有日期时间字段的SQL数据库。

  • VBS提交时间:05/07/2013 05:04:12
  • ASP流程为:05/07/2013 05:04:12
  • 在MSSQL中显示为:2013-07-05 05:04:12.000

问题是我在MSSQL中的格式应为YYYY-MM-DD HH-MM-SS.000 - 它已在上面插入为YYYY-DD-MM HH-MM-SS.000

当我处理这些日期时,这会导致巨大的问题,因为它认为日期是将来的。有趣的是,它似乎只发生在某些日期(我怀疑当天数高于12时会发生这种情况,并且它知道月份不能是13,所以格式正确。

如何永久地设置它以避免SQL以错误的方式插入日期?任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

您可以使用SET DATEFORMAT,就像在此示例中一样

declare @dates table (orig varchar(50) ,parsed datetime)

SET DATEFORMAT ydm;

insert into @dates
select '2008-09-01','2008-09-01'

SET DATEFORMAT ymd;
insert into @dates
select '2008-09-01','2008-09-01'

select * from @dates

Reference

答案 1 :(得分:0)

您始终可以在SQL Server语句中使用ISO格式。我为此目的写了一个函数。

function getIsoTimestamp(dt_in, s_time_zone, n_options)
        ' time zone format examples: "" = local time; "Z" = Zulu time/UTC, "+0100" = MEZ/CET
        ' options:
        '   1: remove time information
        '   2: remove date delimiter char
        '   4: remove time delimiter char
        dim s_out, s_year, s_month, s_day, s_hour, s_min, s_sec
        dim s_date_delim, s_time_delim

        s_out = ""

        if isDate(dt_in) then
                s_date_delim = iff((n_options AND 2)=2, "", "-")
                s_time_delim = iff((n_options AND 4)=4, "", ":")

                ' format date
                s_year = year(dt_in)
                s_month = Right(100 + month(dt_in), 2)
                s_day = Right(100 + day(dt_in), 2)
                s_out = s_year & s_date_delim & s_month & s_date_delim & s_day

                ' format time
                if (n_options AND 1)=0 then
                        s_hour = Right(100 + hour(dt_in), 2)
                        s_min = Right(100 + minute(dt_in), 2)
                        s_sec = Right(100 + second(dt_in), 2)
                        s_out = s_out & "T" & s_hour & s_time_delim & s_min & s_time_delim & s_sec & s_time_zone
                end if
        end if

        getIsoTimestamp = s_out
end function

您可以使用getIsoTimestamp(now(), "", 0)进行测试。