解释起来非常复杂,所以我提前道歉。我在英国,所以这与英国的日期时间格式有关。
我有一个提交到ASP页面的VBS,然后将其插入带有日期时间字段的SQL数据库。
问题是我在MSSQL中的格式应为YYYY-MM-DD HH-MM-SS.000 - 它已在上面插入为YYYY-DD-MM HH-MM-SS.000
当我处理这些日期时,这会导致巨大的问题,因为它认为日期是将来的。有趣的是,它似乎只发生在某些日期(我怀疑当天数高于12时会发生这种情况,并且它知道月份不能是13,所以格式正确。
如何永久地设置它以避免SQL以错误的方式插入日期?任何帮助将不胜感激。
答案 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
答案 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)
进行测试。