Итак, по сути, у меня есть требование передать дату и время и получить конкретную дату и время организации.
ниже функция Sql работает отлично.
Это работает, даже если я вызываю функцию sql из C#.
Но я хочу реализовать ту же логику в C#. Я хочу избавиться от функции sql и напрямую реализовать логику на C# с помощью встроенных запросов.
ALTER FUNCTION [dbo].[fnGetConvertDateTimeWithTimeZoneOffset]
(
@OrganizationID INT,
@LocationID INT,
@Date DATETIME
)
RETURNS DATETIME
AS
BEGIN
DECLARE @TimeOffset INT = 0,
@ConvertedDateTime DATETIME ,
@DayLightSavingHour INT = 60,
@IsDayLight CHAR(1) = 'N'
SELECT @ConvertedDateTime = @Date
IF NOT EXISTS(SELECT 1 FROM dbo.Organization_TimeZone WHERE OrganizationID = @OrganizationID AND LocationId = @LocationID AND @LocationID > 0)
BEGIN
SELECT @LocationID = 0
END
SELECT @TimeOffset = ISNULL(TimeOffsetValue,0), @IsDayLight = ISNULL(IsDayLight,'N')
FROM dbo.Organization_TimeZone WITH (NOLOCK)
WHERE OrganizationID = @OrganizationID
AND (ISNULL(LocationId,0) = @LocationID)
AND IsActive = 'Y'
IF(@TimeOffset 0)
BEGIN
SELECT @TimeOffset =
CASE WHEN @IsDayLight = 'Y' AND @TimeOffset > 0
THEN @TimeOffset - @DayLightSavingHour
WHEN @IsDayLight = 'Y' AND @TimeOffset < 0
THEN @TimeOffset + @DayLightSavingHour
ELSE @TimeOffset
END
SELECT @ConvertedDateTime = DATEADD(MINUTE,@TimeOffset,@Date)
END
RETURN @ConvertedDateTime
END
это функция sql, вызываемая C#.
сейчас она работает нормально.
но когда я реализую ту же логику через С#. это не работает. почему?
вот мой пример кода, который я получил отchatgpt:
using System;
using System.Data.SqlClient;
public class TimeZoneConversion
{
public static DateTime ConvertDateTimeWithTimeZoneOffset(int organizationId, int locationId, DateTime inputDate)
{
// Initialize necessary variables
int timeOffset = 0;
DateTime convertedDateTime = inputDate;
int dayLightSavingHour = 60;
char isDayLight = 'N';
bool hasLocation = CheckIfLocationExists(organizationId, locationId);
if (!hasLocation)
{
locationId = 0;
}
GetTimeZoneAndDaylightSavingInfo(organizationId, locationId, ref timeOffset, ref isDayLight);
if (timeOffset != 0)
{
if (isDayLight == 'Y')
{
timeOffset = AdjustForDaylightSaving(timeOffset, dayLightSavingHour);
}
convertedDateTime = convertedDateTime.AddMinutes(timeOffset);
}
return convertedDateTime;
}
private static void GetTimeZoneAndDaylightSavingInfo(int organizationId, int locationId, ref int timeOffset, ref char isDayLight)
{
string connectionString = "your_connection_string_here"; // Update with your actual DB connection string
using (SqlConnection connection = new SqlConnection(connectionString))
{
string query = @"
SELECT TimeOffsetValue, IsDayLight
FROM dbo.Organization_TimeZone
WHERE OrganizationID = @OrganizationID
AND (ISNULL(LocationId, 0) = @LocationID)
AND IsActive = 'Y'";
using (SqlCommand cmd = new SqlCommand(query, connection))
{
cmd.Parameters.AddWithValue("@OrganizationID", organizationId);
cmd.Parameters.AddWithValue("@LocationID", locationId);
connection.Open();
using (SqlDataReader reader = cmd.ExecuteReader())
{
if (reader.Read())
{
timeOffset = reader.IsDBNull(0) ? 0 : reader.GetInt32(0); // Default to 0 if null
isDayLight = reader.IsDBNull(1) ? 'N' : reader.GetString(1)[0]; // Default to 'N' if null
}
else
{
timeOffset = 0;
isDayLight = 'N';
}
}
}
}
}
private static int AdjustForDaylightSaving(int timeOffset, int dayLightSavingHour)
{
if (timeOffset > 0)
{
return timeOffset - dayLightSavingHour;
}
else if (timeOffset < 0)
{
return timeOffset + dayLightSavingHour;
}
return timeOffset;
}
private static bool CheckIfLocationExists(int organizationId, int locationId)
{
string connectionString = "your_connection_string_here"; // Update with your actual DB connection string
using (SqlConnection connection = new SqlConnection(connectionString))
{
string query = @"
SELECT 1
FROM dbo.Organization_TimeZone
WHERE OrganizationID = @OrganizationID
AND LocationId = @LocationID
AND IsActive = 'Y'";
using (SqlCommand cmd = new SqlCommand(query, connection))
{
cmd.Parameters.AddWithValue("@OrganizationID", organizationId);
cmd.Parameters.AddWithValue("@LocationID", locationId);
connection.Open();
var result = cmd.ExecuteScalar();
return result != null;
}
}
}
}
class Program
{
static void Main()
{
DateTime inputDate = new DateTime(2024, 11, 18, 14, 0, 0); // Example input date (UTC)
DateTime convertedDateTime = TimeZoneConversion.ConvertDateTimeWithTimeZoneOffset(811, 1, inputDate);
Console.WriteLine("Converted DateTime: " + convertedDateTime);
}
}
Подробнее здесь: https://stackoverflow.com/questions/792 ... gic-method
Преобразовать функцию sql в логический метод С# ⇐ C#
Место общения программистов C#
-
Anonymous
1731945800
Anonymous
Итак, по сути, у меня есть требование передать дату и время и получить конкретную дату и время организации.
ниже функция Sql работает отлично.
Это работает, даже если я вызываю функцию sql из C#.
Но я хочу реализовать ту же логику в C#. Я хочу избавиться от функции sql и напрямую реализовать логику на C# с помощью встроенных запросов.
ALTER FUNCTION [dbo].[fnGetConvertDateTimeWithTimeZoneOffset]
(
@OrganizationID INT,
@LocationID INT,
@Date DATETIME
)
RETURNS DATETIME
AS
BEGIN
DECLARE @TimeOffset INT = 0,
@ConvertedDateTime DATETIME ,
@DayLightSavingHour INT = 60,
@IsDayLight CHAR(1) = 'N'
SELECT @ConvertedDateTime = @Date
IF NOT EXISTS(SELECT 1 FROM dbo.Organization_TimeZone WHERE OrganizationID = @OrganizationID AND LocationId = @LocationID AND @LocationID > 0)
BEGIN
SELECT @LocationID = 0
END
SELECT @TimeOffset = ISNULL(TimeOffsetValue,0), @IsDayLight = ISNULL(IsDayLight,'N')
FROM dbo.Organization_TimeZone WITH (NOLOCK)
WHERE OrganizationID = @OrganizationID
AND (ISNULL(LocationId,0) = @LocationID)
AND IsActive = 'Y'
IF(@TimeOffset 0)
BEGIN
SELECT @TimeOffset =
CASE WHEN @IsDayLight = 'Y' AND @TimeOffset > 0
THEN @TimeOffset - @DayLightSavingHour
WHEN @IsDayLight = 'Y' AND @TimeOffset < 0
THEN @TimeOffset + @DayLightSavingHour
ELSE @TimeOffset
END
SELECT @ConvertedDateTime = DATEADD(MINUTE,@TimeOffset,@Date)
END
RETURN @ConvertedDateTime
END
это функция sql, вызываемая C#.
сейчас она работает нормально.
но когда я реализую ту же логику через С#. это не работает. почему?
вот мой пример кода, который я получил отchatgpt:
using System;
using System.Data.SqlClient;
public class TimeZoneConversion
{
public static DateTime ConvertDateTimeWithTimeZoneOffset(int organizationId, int locationId, DateTime inputDate)
{
// Initialize necessary variables
int timeOffset = 0;
DateTime convertedDateTime = inputDate;
int dayLightSavingHour = 60;
char isDayLight = 'N';
bool hasLocation = CheckIfLocationExists(organizationId, locationId);
if (!hasLocation)
{
locationId = 0;
}
GetTimeZoneAndDaylightSavingInfo(organizationId, locationId, ref timeOffset, ref isDayLight);
if (timeOffset != 0)
{
if (isDayLight == 'Y')
{
timeOffset = AdjustForDaylightSaving(timeOffset, dayLightSavingHour);
}
convertedDateTime = convertedDateTime.AddMinutes(timeOffset);
}
return convertedDateTime;
}
private static void GetTimeZoneAndDaylightSavingInfo(int organizationId, int locationId, ref int timeOffset, ref char isDayLight)
{
string connectionString = "your_connection_string_here"; // Update with your actual DB connection string
using (SqlConnection connection = new SqlConnection(connectionString))
{
string query = @"
SELECT TimeOffsetValue, IsDayLight
FROM dbo.Organization_TimeZone
WHERE OrganizationID = @OrganizationID
AND (ISNULL(LocationId, 0) = @LocationID)
AND IsActive = 'Y'";
using (SqlCommand cmd = new SqlCommand(query, connection))
{
cmd.Parameters.AddWithValue("@OrganizationID", organizationId);
cmd.Parameters.AddWithValue("@LocationID", locationId);
connection.Open();
using (SqlDataReader reader = cmd.ExecuteReader())
{
if (reader.Read())
{
timeOffset = reader.IsDBNull(0) ? 0 : reader.GetInt32(0); // Default to 0 if null
isDayLight = reader.IsDBNull(1) ? 'N' : reader.GetString(1)[0]; // Default to 'N' if null
}
else
{
timeOffset = 0;
isDayLight = 'N';
}
}
}
}
}
private static int AdjustForDaylightSaving(int timeOffset, int dayLightSavingHour)
{
if (timeOffset > 0)
{
return timeOffset - dayLightSavingHour;
}
else if (timeOffset < 0)
{
return timeOffset + dayLightSavingHour;
}
return timeOffset;
}
private static bool CheckIfLocationExists(int organizationId, int locationId)
{
string connectionString = "your_connection_string_here"; // Update with your actual DB connection string
using (SqlConnection connection = new SqlConnection(connectionString))
{
string query = @"
SELECT 1
FROM dbo.Organization_TimeZone
WHERE OrganizationID = @OrganizationID
AND LocationId = @LocationID
AND IsActive = 'Y'";
using (SqlCommand cmd = new SqlCommand(query, connection))
{
cmd.Parameters.AddWithValue("@OrganizationID", organizationId);
cmd.Parameters.AddWithValue("@LocationID", locationId);
connection.Open();
var result = cmd.ExecuteScalar();
return result != null;
}
}
}
}
class Program
{
static void Main()
{
DateTime inputDate = new DateTime(2024, 11, 18, 14, 0, 0); // Example input date (UTC)
DateTime convertedDateTime = TimeZoneConversion.ConvertDateTimeWithTimeZoneOffset(811, 1, inputDate);
Console.WriteLine("Converted DateTime: " + convertedDateTime);
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79200600/convert-sql-function-to-c-sharp-logic-method[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия